2012-02-04 13 views
6

estaba experimentando la Associaton polimórficos en Mongoidcómo quitar atributos de un modelo Mongoid, es decir, no sólo anular sus valores

class Group 
    include Mongoid::Document 
    belongs_to :groupable, polymorphic: true 
end 

class Album 
    include Mongoid::Document 
    has_many :groups, as: groupable 
end 

entonces decidí no hacerlo. Así que eliminé todas las líneas belongs_to y has_many de arriba. Sin embargo, en la consola, cada vez que obtengo un registro grupal con el que experimenté, todavía tiene este atributo "tipo_de_modelo". Sé que remove_attribute anula el atributo, pero no lo elimina (suena un poco como JavaScript). ¿Cómo puedo eliminar este atributo de la base de datos de Mongoid?

Respuesta

13

Usted puede hacer esto:

Group.collection.update({}, 
         {'$unset' => {:groupable_type => 1}}, 
         :multi => true) 
+0

Vi algo sobre "unset" después de googlear, no me di cuenta de que es algo de la consola mongo. - en su opinión, ¿no es esto un poco engorroso eliminar un campo? ¡Gracias! –

+5

No es "de la consola mongo", es un operador mongodb de primera clase. Mongoid podría tener un método de ayuda para esto, pero no hay nada malo en ir al controlador subyacente. Además, siempre puedes escribir tal ayudante tú mismo. :) –

+0

oops .. ooops .. ooops ... cada vez que vi lo $, alguna razón, pensé en la consola ... Perdón por eso. Y no podría estar más de acuerdo, tener esos operadores PODEROSOS de primera clase fue una de las razones por las que migré a MongoDB/Mongoid (y también para no tener que "migrar" nada más: D). Esperando otros 3 minutos para marcar "respondido" –

0

Noté en ciclomotor 2.0.0.rc1 el método de actualización se ha ido en la colección, pero esto funciona;

Group.collection.find().update(
        {'$unset' => {:groupable_type => 1}}, 
        :multi => true)  
2

partir de la versión 5.0.0 de Mongoid, la gema ha pasado de utilizar ciclomotor a utilizar el 'piloto oficial rubí MongoDB' que tiene una sintaxis diferente para las actualizaciones. Referencia: https://docs.mongodb.org/ecosystem/drivers/ruby/

La documentación de los métodos de recolección está aquí: http://api.mongodb.org/ruby/current/Mongo/Collection.html

Hay 2 métodos, "actualización" y "update_many". Puede usar update_many en lugar de especificar la opción 'multi' para actualizar todos los documentos.

utilización ejemplo para el caso PO:

Group.collection.update_many({}, {'$unset' => {'groupable_type' => true}}) 

Nota se puede desarmar la inclusión de documentos utilizando la notación de puntos:

Group.collection.update_many({}, {'$unset' => {'embedded_doc.groupable_type' => true}}) 

nota que no está bien apoyado por MongoDB a los campos/actualización no se ha establecido dentro de una formación. Consulte este hilo para obtener información y soluciones: https://jira.mongodb.org/browse/SERVER-1243.

Cuestiones relacionadas