Na to nemusíte volat .clone, můžete použít nezpracovaná data z attributes
. Například níže uvedená metoda/příklad poskytne nová ID v celém dokumentu, pokud nějaké najde.
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))
A nyní máte kopii Car. To je však neefektivní, protože musí projít celým hashem, aby se zjistilo, zda jsou ve vloženém dokumentu nějaké vložené dokumenty. Bylo by lepší, kdybyste strukturu resetovali sami, pokud víte, jak to bude, například pokud máte součástky zabudované do auta, pak můžete jednoduše:
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}
Což je mnohem efektivnější než jen provést obecný reset.