Anda tidak perlu memanggil .clone untuk ini, Anda dapat menggunakan data mentah dari attributes
. Misalnya metode/contoh di bawah ini akan memberikan id baru di seluruh dokumen jika ditemukan.
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))
Dan Anda sekarang memiliki salinan Mobil. Ini tidak efisien karena harus melalui seluruh hash untuk catatan untuk mengetahui apakah ada dokumen yang disematkan dalam dokumen yang disematkan. Anda akan lebih baik mengatur ulang struktur sendiri jika Anda tahu bagaimana jadinya, misalnya, jika Anda memiliki suku cadang yang tertanam di mobil, maka Anda bisa melakukan:
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}
Yang jauh lebih efisien daripada hanya melakukan reset umum.