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
Articoli simili
- No Related Posts