Du behöver inte anropa .clone för detta, du kan använda rådata från attributes
. Till exempel kommer metoden/exemplet nedan att ge nya ID i hela dokumentet om det hittar ett.
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))
Och du har nu en kopia av Bil. Detta är dock ineffektivt eftersom det måste gå igenom hela hashen för att posten ska ta reda på om det finns några inbäddade dokument i ett inbäddat dokument. Du skulle vara bättre att återställa strukturen själv om du vet hur den kommer att bli, till exempel om du har en del inbäddad i bilen, då kan du bara göra:
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}
Vilket är mycket effektivare än att bara göra en generisk återställning.