2011-11-17 23 views
5

Ho seguente modello d'uso, incorpora il modello di Categoria,MongoDB - creare un nuovo documento in un array integrato

class User 
    include Mongoid::Document 
    include BCrypt 

    field :email,   :type => String 
    field :password_hash, :type => String 
    field :password_salt, :type => String 

    embeds_many :categories 
    embeds_many :transactions 
    .... 
    end 

La mia domanda è, ho appena scoperto che se io uso il codice:

me = User.where("some conditions") 
me.categories << Category.new(:name => "party") 

tutto funziona bene, ma se uso il metodo .create:

me = User.where("some conditions") 
me.categories << Category.create(:name => "party") 

mi metterò un'eccezione:

undefined method `new?' for nil:NilClass 

Qualcuno sa perché? E da mongoid.org http://mongoid.org/docs/persistence/standard.html, ho potuto vedere che .new e .create generano effettivamente lo stesso comando mongo.

Ha bisogno di aiuto, grazie :)

risposta

10

Crea subito persistono il documento in mongo. Poiché il documento di categoria si trova in un altro documento (come incorporato) non è possibile salvarlo separatamente. Ecco perché stai ricevendo l'errore.

Per maggiore chiarezza, si consideri il documento incorporato come un campo nel documento genitore che contiene campi secondari. Ora puoi facilmente capire che non puoi salvare un campo senza un documento. destra?

D'altra parte nuova inizializzare la classe del documento e verrà inserito solo nel doc genitore quando si utilizza < <.

Category.create(:name => "party") 
>>NoMethodError: undefined method `new?' for nil:NilClass 

è equivalente a

c = Category.new(:name => "party") 
c.save 
>>NoMethodError: undefined method `new?' for nil:NilClass 

Spero che questo aiuti

+0

totalmente capire, molto chiaro. – larryzhao

Problemi correlati