U hoeft hiervoor geen .clone aan te roepen, u kunt de onbewerkte gegevens uit attributes
gebruiken . De onderstaande methode/voorbeeld geeft bijvoorbeeld nieuwe id's door het hele document als er een wordt gevonden.
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))
En je hebt nu een kopie van Car. Dit is echter inefficiënt omdat het de hele hash moet doorlopen voordat het record kan achterhalen of er ingesloten documenten in een ingesloten document zijn. U kunt de structuur beter zelf resetten als u weet hoe het zal zijn, bijvoorbeeld als u onderdelen in de auto heeft ingebouwd, dan kunt u gewoon het volgende doen:
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}
Dat is een stuk efficiënter dan alleen een algemene reset uitvoeren.