Non è necessario chiamare .clone su questo, puoi utilizzare i dati grezzi da attributes
. Ad esempio, il metodo/esempio seguente fornirà nuovi ID in tutto il documento se ne trova uno.
def reset_ids(attributes)
attributes.each do |key, value|
if key == "_id" and value.is_a?(BSON::ObjectId)
attributes[key] = BSON::ObjectId.new
elsif value.is_a?(Hash) or value.is_a?(Array)
attributes[key] = reset_ids(value)
end
end
attributes
end
original = Car.find(old_id)
car_copy = Car.new(reset_ids(original.attributes))
E ora hai una copia di Car. Tuttavia, questo è inefficiente in quanto deve passare attraverso l'intero hash affinché il record possa capire se sono presenti documenti incorporati in un documento incorporato. Faresti meglio a ripristinare tu stesso la struttura se sai come sarà, ad esempio, se hai una parte incorporata nell'auto, puoi semplicemente fare:
original = Car.find(old_id)
car_copy = Car.new(original.attributes)
car_copy._id = BSON::ObjectId.new
car_copy.parts.each {|p| p._id = BSON::ObjectId.new}
Il che è molto più efficiente di un semplice ripristino generico.