Você não precisa chamar .clone para isso, você pode usar os dados brutos de
attributes
. Por exemplo, o método/exemplo abaixo fornecerá novos ids em todo o documento, se encontrar um. 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))
E agora você tem uma cópia do carro. Isso é ineficiente, pois precisa passar por todo o hash para o registro descobrir se há algum documento incorporado em um documento incorporado. Seria melhor você mesmo redefinir a estrutura se souber como será, por exemplo, se tiver peças embutidas no carro, basta fazer:
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}
O que é muito mais eficiente do que apenas fazer uma redefinição genérica.