Mongodb - создать новый документ во встроенном массиве - PullRequest
5 голосов
/ 17 ноября 2011

У меня есть следующая модель пользователя, встраивает модель категории,

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

Мой вопрос, я только что обнаружил, что если я использую код:

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

все работает нормально,но если я использую метод .create:

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

, я получу исключение:

undefined method `new?' for nil:NilClass

Кто-нибудь знает, почему это так?А из mongoid.org http://mongoid.org/docs/persistence/standard.html, я мог видеть, что .new и .create фактически генерируют одну и ту же команду mongo.

Нужна помощь, спасибо:)

1 Ответ

10 голосов
/ 17 ноября 2011

Создать немедленно сохранить документ в монго. Поскольку документ категории находится в другом документе (как встроенный), вы не можете сохранить его отдельно. Вот почему вы получаете ошибку.

Для большей ясности предположим, что встроенный документ является полем в родительском документе. документ, который содержит подполя. Теперь вы можете легко понять, что Вы не можете сохранить поле без документа. право?

Другая рука new инициализирует класс документа и будет вставляться только в родительский документ при использовании <<. </p>

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

эквивалентно

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

Надеюсь, это поможет

...