Rails - Patch per datetime

Il problema è stato risolto nella attuale release di Ruby on Rails.

L’attuale versione di Rails presenta un problema nella gestione degli attributi date e datetime delle classi ActiveRecord dovuto al mancato cast escalation dalla classa Time alla classe Date. I problema si presenta durante l’assegnamento di date che cadono al di fuori del range supportato dalla classe Time.

Per applicare la patch è sufficiente copiare il codice riportato sotto ed incollarlo all’interno del file environment.rb; in questo modo all’avvio dell’applicazione verrà effettuato un override della parte di codice di ActiveRecord che presenta dei problemi.


class ActiveRecord::ConnectionAdapters::Column

  def self.string_to_time(string)
    return string unless string.is_a?(String)
    time_array = ParseDate.parsedate(string)[0..5]
    begin
      Time.send(Base.default_timezone, *time_array)
    rescue
      DateTime.new(*time_array)
    rescue nil
    end
  end
end

class ActiveRecord::Base

  def execute_callstack_for_multiparameter_attributes(callstack)

    errors = []
    callstack.each do |name, values|
      klass = (self.class.reflect_on_aggregation(name) || column_for_attribute(name)).klass

      if values.empty?
        send(name + "=", nil)
      else

        begin
          send(name + "=", Time == klass ? klass.local(*values) : klass.new(*values))
        rescue ArgumentError => ex

          if Time == klass
            then
            begin
              send(name + "=", DateTime.new(*values))

            rescue => ex
              errors << AttributeAssignmentError.new("error on assignment #{values.inspect} to #{name}", ex, name)

            end
          else
            errors << AttributeAssignmentError.new("error on assignment #{values.inspect} to #{name}"
            , ex, name)
          end
        rescue => ex
          errors << AttributeAssignmentError.new("error on assignment #{values.inspect} to #{name}", ex, name)
        end
      end
    end

    unless errors.empty?
      raise MultiparameterAssignmentErrors.new(errors), "#{errors.size} error(s) on assignment of multiparameter attributes"

    end
  end
end

28 Febbraio 2006
Categorie: Ruby on Rails

AddThis Social Bookmark Button

Articoli simili

Commenti

Comments are closed.