Вам не нужно вызывать .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))
И теперь у вас есть копия автомобиля.Однако это неэффективно, поскольку необходимо пройти через весь хеш, чтобы запись выяснила, есть ли какие-либо встроенные документы во встроенном документе.Вам лучше сбросить структуру самостоятельно, если вы знаете, как это будет, например, если у вас есть детали, встроенные в автомобиль, тогда вы можете просто сделать:
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}
Что намного большеэффективнее, чем просто сделать общий сброс.