All, Assume an AR model with an after_initialize method, which is used to initialize attribute values. An example would be: class X < ActiveRecord::Base ... def after_initialize self.attr1 = 0 end end Further assume that x is an instance of X, and x.attr1 has been assigned the value 3. If I do y = x.clone, and interrogate the value of y.attr1, I''ll get 0. This makes sense given the source code for AR#clone. But I expected the value of attr1 to be 3, not 0. I would think that clone should completely instantiate the new object, and _then_ assign the attribute values from the original object. Is the current behavior a bug, or am I missing some important philosophical point. Thanks, Wes -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Wes Gamble
2007-Jan-15 20:30 UTC
Re: AR clone interaction with initialization logic in model
One way around this is to modify the after_initialize logic to not assume that the attribute values should always be set, like so: class X < ActiveRecord::Base ... def after_initialize if self.new_record? self.attr1 ||= 0 end end end In a clone situation, attr1 will already have a value and therefore, won''t be initialized to a default value. Still, I feel like clone has a bug in it. Here''s what happens in a regular Ruby object: class X attr_accessor :val def initialize @val = 5 end end x = X.new x.val => 5 x.val = 23 => 23 y = x.clone => #<X:0x2c33148 @val=23> The value of @val in the cloned object is 23, not 5. While I concede that after_initialize is a standalone method that officially has nothing to do with Ruby object initialization, I still feel like the clone method should set the attribute values after the object is instantiated. Wes -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---