Sie müssen dafür nicht .clone aufrufen, Sie können die Rohdaten von attributes
verwenden . Zum Beispiel gibt die folgende Methode/das folgende Beispiel neue IDs im gesamten Dokument aus, wenn es eine findet.
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))
Und Sie haben jetzt eine Kopie von Car. Dies ist jedoch ineffizient, da der gesamte Hash für den Datensatz durchlaufen werden muss, um herauszufinden, ob es eingebettete Dokumente in einem eingebetteten Dokument gibt. Sie sollten die Struktur besser selbst zurücksetzen, wenn Sie wissen, wie es sein wird, zum Beispiel, wenn Sie ein Teil in ein Auto eingebettet haben, dann können Sie einfach Folgendes tun:
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}
Das ist viel effizienter als nur ein generisches Zurücksetzen.