Bạn không cần gọi .clone trên này, bạn có thể sử dụng dữ liệu thô từ các thuộc tính attributes
. Ví dụ:phương thức / ví dụ dưới đây sẽ cung cấp các id mới trong toàn bộ tài liệu nếu nó tìm thấy một.
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))
Và bây giờ bạn có một bản sao của Xe hơi. Điều này không hiệu quả mặc dù nó phải trải qua toàn bộ băm cho bản ghi để tìm ra liệu có bất kỳ tài liệu nhúng nào trong một tài liệu được nhúng hay không. Tốt hơn hết bạn nên tự mình đặt lại cấu trúc nếu bạn biết nó sẽ như thế nào, chẳng hạn như nếu bạn có một bộ phận nào đó được nhúng vào ô tô, thì bạn chỉ cần thực hiện:
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}
Điều này hiệu quả hơn rất nhiều so với việc chỉ thiết lập lại chung chung.