mongoid.update_attributes не работает с новым встроенным объектом

Я пытаюсь создать новый встроенный объект с update_attributes от его родителя. В mongoid 2.0.0.beta20 это работало нормально, но после обновления до 2.3.3 это не работает.

Чтобы воспроизвести, вы можете использовать эту структуру модели:

class Bird
  include Mongoid::Document
  embeds_one :egg
  accepts_nested_attributes_for :egg
end

class Egg
  include Mongoid::Document
  field :weight, :type => Integer, :default => 10
  field :size, :type => Array, :default => [10,10]

  def height=(value)
    self.size[0] = value
  end

  def width=(value)
    self.size[1] = value
  end

  def height
    self.size[0]
  end

  def width
    self.size[1]
  end

end

Затем запустите в рубиновой консоли:

b = Bird.new
 => #<Bird _id: 4eb163660d996a3e43000002, _type: nil>
b.update_attributes "egg" => { "height" => 20, "weight" => 20 }
NoMethodError: You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]=
from (irb):14:in `height='
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:98:in `process_attribute'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:26:in `block in process'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:24:in `each_pair'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:24:in `process'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/document.rb:131:in `block in initialize'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/threaded/lifecycle.rb:84:in `_building'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/document.rb:127:in `initialize'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/factory.rb:23:in `new'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/factory.rb:23:in `build'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/relations/builders/nested_attributes/one.rb:30:in `build'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:137:in `block in process_relations'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:134:in `each_pair'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:134:in `process_relations'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:122:in `process_pending'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:29:in `process'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes.rb:133:in `block in assign_attributes'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/threaded/lifecycle.rb:26:in `_assigning'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes.rb:132:in `assign_attributes'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes.rb:154:in `write_attributes'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/persistence.rb:115:in `update_attributes'
from (irb):36
from vendor/ruby/1.9.1/gems/railties-3.1.1/lib/rails/commands/console.rb:45:in `start'
from vendor/ruby/1.9.1/gems/railties-3.1.1/lib/rails/commands/console.rb:8:in `start'
from vendor/ruby/1.9.1/gems/railties-3.1.1/lib/rails/commands.rb:40:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'system :037 > 

Это связано с тем, что встроенный объект не инициализируется до установки новых значений. Вот почему массив размеров не инициализирован и, следовательно, по-прежнему равен нулю. Используя mongoid-2.0.0.beta20 (с которого я обновляюсь), все работает нормально. Есть ли что-то, что мне не хватает? Ожидает ли новый mongo-2.3.3, что ME сначала инициализирует встроенный объект!?

Спасибо за любую помощь|подсказку.


person Daniel    schedule 02.11.2011    source источник


Ответы (1)


Значения по умолчанию теперь применяются после того, как установлены все остальные атрибуты, на случай, если вы должны были использовать процедуру по умолчанию, которая условно зависела от других. Теперь ваши методы height= и width= должны знать об этом.

Видеть:

https://github.com/mongoid/mongoid/issues/1075

person Durran    schedule 08.11.2011
comment
Дарран, большое спасибо за эту информацию. Это объясняет новое поведение. Есть ли информация, почему вы изменили это? Мне очень удобно, чтобы значения по умолчанию устанавливались непосредственно при инициализации. - person Daniel; 08.11.2011