Не е нужно да извиквате .clone за това, можете да използвате необработените данни от attributes
. Например методът/примерът по-долу ще даде нови идентификатори в целия документ, ако намери такъв.
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))
И вече имате копие на Car. Това обаче е неефективно, тъй като трябва да премине през целия хеш за записа, за да разбере дали има вградени документи във вграден документ. Би било по-добре да нулирате структурата сами, ако знаете как ще бъде, например, ако имате части, вградени в кола, тогава можете просто да направите:
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}
Което е много по-ефективно от обикновено нулиране.