ИППП и вложенные атрибуты массового назначения в монгоиде - PullRequest
2 голосов
/ 05 октября 2011

Вопрос о массовом назначении через вложенные атрибуты с использованием 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 Ответ

2 голосов
/ 05 октября 2011

Прежде всего, обратитесь к документации по API для вашего объяснения по attr_accessible здесь .Это должно дать вам более глубокое понимание.

Во-вторых, вы используете attr_accessor для заказа, который вам не нужен, поскольку это поле базы данных.

Наконец, вам нужно установить attr_accessible :workers_attributes для модели вашей компании.Это позволяет хешу :workers_attributes, созданному accepts_nested_attributes_for, сохраняться посредством массового присвоения.

...