ActiveRecord object cloning

In Ruby when an object is cloned the newly created object is
initialized via #initialize_copy. Only new objects are initialized via

Currently ActiveRecord::Base overrides #clone and creates clones using
#new. This means newly cloned objects are initialized via a
combination of #clone and #initialize instead of via #initialize_copy.
Is the Rails core group interested in seeing a patch which removes the
ActiveRecord#clone method and instead implements cloning by defining
an #initialize_copy method?

Doing so would make implementing application specific deep cloning
much easier as classes can simply define their own #initialize_copy

+1, overriding initialize_copy is the correct way. We shouldn't be
overriding dup and clone.

Wasn't some of the stuff is AR::Base#clone fixed to handle issues with
attribute copying or initializers? I think I remember something like 3
years ago.. but I'm too lazy to search.

My feeling is that AR::Base#clone does was 99% of developers expect it
to do. Any deep copying that happens usually ends up in a unique
method on the class a la 'object.deep_copy'. I support the idea of
the change, I just worry that it might be more work than its worth.

I've created a patch for this change which can be found at All the
tests pass and #clone acts correctly. However I'd really appreciate
some feedback on one niggling point regarding when the
after_initialize callbacks get run.