2012-02-04 3 views
6

stavo sperimentando l'Associaton polimorfico in Mongoidcome rimuovere gli attributi da un modello Mongoid, vale a dire, non solo annullando i loro valori

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

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

poi ho deciso contro di esso. Quindi ho rimosso tutte le righe this_to e has_many sopra. Eppure nella console, ogni volta che ottengo un record di gruppo con cui ho sperimentato, ha ancora questo attributo "groupable_type". So che remove_attribute annulla l'attributo, ma non lo rimuove (sembra un po 'come JavaScript). Come posso rimuovere questo attributo dal database da Mongoid?

risposta

13

Si potrebbe fare questo:

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

Ho visto qualcosa riguardo "unset" dopo il google, non ho capito che si tratta di qualcosa della console mongo. - secondo te, non è un po 'ingombrante rimuovere un campo? Grazie! –

+5

Non è "dalla console di mongo", è un operatore di mongodb di prima classe. Mongoid potrebbe avere un metodo di supporto per questo, ma non c'è nulla di male nell'andare al driver sottostante. Inoltre, puoi sempre scrivere un aiuto simile. :) –

+0

oops .. ooops .. ooops .. ogni volta che ho visto la cosa $, qualche motivo, ho pensato alla console .. Ci scusiamo per questo. E non potrei essere più d'accordo, avere questi potenti e PRINCIPALI operatori di prima classe è stata una delle ragioni principali per cui sono migrato a MongoDB/Mongoid (e anche perché non devo più "migrare" nulla: D). Aspettando altri 3 minuti per verificare "risposta" –

0

ho notato nel ciclomotore 2.0.0.rc1 il metodo di aggiornamento è andato sulla raccolta, ma questo funziona;

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

A partire dalla versione 5.0.0 di Mongoid, la gemma è passato da utilizzare ciclomotore di utilizzare il 'pilota ufficiale rubino MongoDB', che ha una sintassi diversa per gli aggiornamenti. Riferimento: https://docs.mongodb.org/ecosystem/drivers/ruby/

La documentazione per i metodi di raccolta è qui: http://api.mongodb.org/ruby/current/Mongo/Collection.html

ci sono 2 metodi, "aggiornamento" e "update_many". Puoi utilizzare update_many invece di specificare l'opzione "multi" per aggiornare tutti i documenti.

uso Esempio per il caso PO:

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

Nota è possibile disinserire documenti incorporati usando la notazione punto:

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

Nota che non è ben supportato da MongoDB a campi/aggiornamento unset all'interno di un array. Vedere questo thread per informazioni e soluzioni alternative: https://jira.mongodb.org/browse/SERVER-1243.

Problemi correlati