AR overrides clone() to handle shallow copies. As for associations
you'll have to handle these yourself. Here is a cut-and-paste from
the rails source so you can see the implementation.
# Returns a clone of the record that hasn't been assigned an id yet and
# is treated as a new record. Note that this is a "shallow" clone:
# it copies the object's attributes only, not its associations.
# The extent of a "deep" clone is application-specific and is therefore
# left to the application to implement according to its need.
attrs = self.attributes_before_type_cast
self.class.new do |record|
record.send :instance_variable_set, '@attributes', attrs
Hope this helps.