MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Documento de clone profundo com associações incorporadas


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.