Nie musisz w tym celu wywoływać .clone, możesz użyć surowych danych z attributes
. Na przykład poniższa metoda/przykład da nowe identyfikatory w całym dokumencie, jeśli je znajdzie.
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 teraz masz kopię Car. Jest to jednak nieefektywne, ponieważ musi przejść przez cały skrót, aby rekord mógł ustalić, czy w osadzonym dokumencie znajdują się jakiekolwiek osadzone dokumenty. Lepiej byłoby samodzielnie zresetować strukturę, jeśli wiesz, jak to będzie, na przykład, jeśli masz części wbudowane w samochód, możesz po prostu zrobić:
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 jest o wiele bardziej wydajne niż zwykły reset.