2011-11-17 16 views
5

He siguiente modelo de usuario, se incrusta el modelo Categoría,MongoDB - crear un nuevo documento en una matriz incrustada

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 

Mi pregunta es, que acaba de encontrar que si uso el código:

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

todo funciona bien, pero si uso el método .Create:

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

que obtendrá una excepción:

undefined method `new?' for nil:NilClass 

¿Alguien sabe por qué es eso? Y de mongoid.org http://mongoid.org/docs/persistence/standard.html, pude ver que .new y .create en realidad genera el mismo comando mongo.

Necesita ayuda, gracias :)

Respuesta

10

Create persisten inmediatamente el documento en mongo. Como el documento de categoría está dentro de otro documento (como incrustado), no puede guardarlo por separado. Es por eso que está obteniendo el error.

Para mayor claridad, asuma el documento incrustado como un campo en el documento principal que contiene subcampos. Ahora puede comprender fácilmente que no puede guardar un campo sin un documento. ¿derecho?

Otro lado nueva inicializar la clase de documento y se Sólo inserta en el documento de los padres cuando se utiliza < <.

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

es equivalente a

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

Esperanza esto ayuda

+0

entienden totalmente, muy claro. – larryzhao

Cuestiones relacionadas