आपको इस पर .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}
जो केवल एक सामान्य रीसेट करने की तुलना में बहुत अधिक कुशल है।