Forum: Ruby on Rails ActiveRecord handling of obj.dup vs obj.clone

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
3ff4bb8e6994d0975ead228e6bf33a22?d=identicon&s=25 daudi (Guest)
on 2009-01-09 10:33
(Received via mailing list)
AR seems to be handling model object dup and cloning differently from
Ruby documented behavior.  I've checked out both ways (as an AR model
and not) and the behavior is different.  I don't see anything in the
RAILS documentation about this.  Am I missing something? is this a
bug? a feature? an interesting lifestyle?
I can hack around this difference but it is not elegant.
-----------------------------------------------------------
example 1 using AR:

class Model < ActiveRecord::Base
# etc, normal model stuff, associations
  def initialize_copy(old_obj)
    # do something
  end
end

obj = Model.find(1)
obj_dup = obj.dup   # does NOT yield a new object; does invoke
obj_dup.initialize_copy(obj)
# at this point obj_dup is same object as obj; any changes to obj_dup
will change obj
# but obj_dup changes have not been saved to DB yet

obj_clone = obj.clone  # does yield a new object; does NOT invoke
obj_clone.initialize_copy(obj)
# at this point obj_clone is a different object but not yet saved to
DB
----------------------------------------------------------------
example 2 using pure Ruby:

class Test
   attr_reader  :name
   def initialize(str)
     @name = str
   end
   def initialize_copy(old)
      @name += ' *** COPY ***'
   end
end

a = Test.new 'john'   # a.name is now: 'john'
b = a.dup    # b.name is now: 'john *** COPY ***'
c = a.clone  # c.name is now: 'john *** COPY ***'

# a, b, c are all DIFFERENT objects
# b.initialize_copy(a) was invoked per Ruby documentation
# c.initialize_copy(a) was invoked per Ruby documentation
This topic is locked and can not be replied to.