Du behøver ikke at kalde .clone på dette, du kan bruge rådata fra attributes
. For eksempel vil nedenstående metode/eksempel give nye id'er gennem hele dokumentet, hvis det finder et.
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))
Og du har nu en kopi af Bil. Dette er dog ineffektivt, da det skal gennemgå hele hashen for at posten kan finde ud af, om der er indlejrede dokumenter i et indlejret dokument. Du ville være bedre stillet at nulstille strukturen selv, hvis du ved, hvordan den vil være, for eksempel hvis du har en del indlejret i bilen, så kan du bare gøre:
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}
Hvilket er meget mere effektivt end blot at udføre en generisk nulstilling.