【发布时间】:2011-10-02 23:18:30
【问题描述】:
鉴于以下模型:
class Company
include Mongoid::Document
has_many :workers, autosave: true
accepts_nested_attributes_for :workers
attr_accessible :workers_attributes
end
class Worker
include Mongoid::Document
field :hours
attr_accessible :hours
belongs_to :company
end
class Manager < Worker
field :order
has_many :contributors, :class_name => "Worker"
attr_accessible :order, :contributors
end
class Contributor < Worker
field :task
belongs_to :manager, :class_name => "Worker"
attr_accessible :task
end
如何在控制器中创建公司经理并使用嵌套属性查看?
这是我的猜测:
def new
@company = Company.new
@company.workers = [Manager.new]
end
def create
@company = Company.new params[:user]
if @company.save
redirect_to root_url, :notice => "Company with manager created."
else
render :new
end
end
= semantic_form_for @company do |f|
= f.semantic_fields_for :workers do |worker_fields|
= worker_fields.inputs do
= worker_fields.input :hours
= worker_fields.input :order
问题是专门属于经理的订单字段在创建后没有保留。同样当数据填写不正确时也会出现错误:
undefined method `order' for #<Worker:0x0000000646f018> (ActionView::Template::Error)
那么有没有办法让嵌套属性处理模型中从 mongoid 的继承?
该问题与Can nested attributes be used in combination with inheritance? 相关,但不是使用 mongoid 的活动记录。
老实说,这是对我的代码的解释......虽然我相信这些都是相关部分,但真正的代码情况更复杂。如果您还有其他问题,请提出。
更新:
我将视图更改为以下内容:
= semantic_form_for @company do |f|
- @company.workers.each do |worker|
- if worker._type == "Manager"
= f.semantic_fields_for :workers, worker do |worker_fields|
= worker_fields.inputs do
= worker_fields.input :hours
= worker_fields.input :order
我不再收到错误消息,但是嵌套属性没有正确更新公司对象。参数如下:
{"company"=> {"workers_attributes"=>{"0"=>{"hours"=>"30", "order" => "fish", "id"=>"4e8aa6851d41c87a63000060"}}}}
为简洁起见再次编辑。所以关键部分是“0”=> {data for manager}之间有一个散列。工人数据似乎保存在哈希中。我希望数据看起来更像以下:
params = { company => {
workers_attributes => [
{ hours => "30", "order" => "fish" }
]}}
这是不同的,因为工人数据保存在数组而不是散列中。是否还有其他步骤可以正确保存嵌套属性?
谢谢
【问题讨论】:
-
好的,我离解决方案更近了。使用 fields_for :工人,工人。将根据我的进度更新问题
-
我想我走错了方向。我相信问题变成了可以使用嵌套属性批量填充使用单表继承的模型
标签: ruby-on-rails view mongoid nested-attributes single-table-inheritance