STI и присвояване на маса на вложен атрибут в mongoid?

Въпрос за масово присвояване чрез вложени атрибути с помощта на mongoid.

Пример:

require 'mongoid'
require 'mongo'

class Company
  include Mongoid::Document

  has_many :workers,as: :workable, autosave: true
  accepts_nested_attributes_for :workers
end

class Worker
  include Mongoid::Document
  field :hours, type: Integer, default: 0
  belongs_to :workable, polymorphic: true
end

class Manager < Worker
  include Mongoid::Document
  field :order
  #attr_accessible :order
  attr_accessor :order

  validates_presence_of :order
end

Mongoid.configure do |config|
  config.master = Mongo::Connection.new.db("mydb")
end
connection = Mongo::Connection.new
connection.drop_database("mydb")
database = connection.db("mydb")

params = {"company" => {"workers_attributes" => {"0" => {"_type" => "Manager","hours" => 50, "order" => "fishing"}}}}
company = Company.create!(params["company"])
company.workers.each do |worker|
  puts "worker = #{worker.attributes}"
end

Това извежда следното:

worker = {"_id"=>BSON::ObjectId('4e8c126b1d41c85333000002'), "hours"=>50, "_type"=>"Manager", "workable_id"=>BSON::ObjectId('4e8c126b1d41c85333000001'), "workable_type"=>"Company"}

Ако коментираният ред

attr_accessible :order 

се коментира в Вместо това получавам следното:

WARNING: Can't mass-assign protected attributes: _type, hours
worker = {"_id"=>BSON::ObjectId('4e8c12c41d41c85352000002'), "hours"=>0, "_type"=>"Manager", "workable_id"=>BSON::ObjectId('4e8c12c41d41c85352000001'), "workable_type"=>"Company"}

Забележете как стойността на часовете не се актуализира от стандартната.

Въпрос, защо коментирането в attr_accessible обърква устойчивостта на моя документ. Също така съм нов в релсите и не разбирам напълно attr_accessible, но знам, че имам нужда от него, за да попълня полета през моя изглед. Как мога да накарам документа си да продължи, като използвам коментирания ред attr_accessible?

Благодаря




Отговори (1)


Първо проверете документите на API за вашето обяснение на attr_accessible тук. Това трябва да ви осигури по-задълбочено разбиране.

Второ, вие използвате attr_accessor за поръчка, която не ви е необходима, защото е поле на база данни.

И накрая, трябва да зададете attr_accessible :workers_attributes на вашия фирмен модел. Това позволява хешът :workers_attributes, който е създаден от accepts_nested_attributes_for, да бъде запазен чрез масово присвояване.

person janders223    schedule 05.10.2011
comment
Това напълно работи, благодаря много, имах този проблем за известно време и не бях сигурен къде да търся досега. - person GTDev; 05.10.2011
comment
Няма проблем. Винаги се опитвам да добавя свързаните API документи, когато отговарям на въпроси. Те винаги са чудесно място за търсене на информация. - person janders223; 05.10.2011