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 #initialize.

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 method.

+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 #3164 Instantiate through initialize_copy when cloning - Ruby on Rails - rails. 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.