これで.cloneを呼び出す必要はありません。attributes
からの生データを使用できます。 。たとえば、以下のメソッド/例では、ドキュメントが見つかった場合、ドキュメント全体で新しいIDが提供されます。
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}
これは、一般的なリセットを実行するよりもはるかに効率的です。