Ruby on rails 使用嵌套属性填写继承的mongoid文档

Ruby on rails 使用嵌套属性填写继承的mongoid文档,ruby-on-rails,view,mongoid,nested-attributes,single-table-inheritance,Ruby On Rails,View,Mongoid,Nested Attributes,Single Table Inheritance,鉴于以下模型: 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 :hour

鉴于以下模型:

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
问题是,在创建之后,专门属于经理的订单字段没有持久化。此外,如果数据填写不正确,则会出现错误:

undefined method `order' for #<Worker:0x0000000646f018> (ActionView::Template::Error)
我不再得到错误,但是嵌套属性不能正确更新company对象。参数如下所示:

= 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"}}}}
params = { company => {
    workers_attributes => [
        { hours => "30", "order" => "fish" }
    ]}}
为简洁起见,再次编辑。所以关键部分是“0”=>{data for manager}之间有一个散列。工人数据似乎保存在散列中。我希望数据看起来更像以下内容:

= 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"}}}}
params = { company => {
    workers_attributes => [
        { hours => "30", "order" => "fish" }
    ]}}
这是不同的,因为workers数据保存在数组中,而不是散列中。是否还有其他步骤可以正确保存嵌套属性


谢谢

您使用的是什么版本的Mongoid?因为我不认为使用references\u many是受鼓励的——这与您的问题无关,只是想探究您正在使用的版本。在华丽的Mongoid.org上的文档中,我了解到了这一点,我不得不用艰苦的方式学习,他们说要更新记录,需要将自动存储集设置为true。那不准确。你甚至需要它来创造

因此:

增加:


我在重新阅读您的代码时,发现了以下问题:您的公司模型设置为has_many:workers,并且设置为在发生更改时接受Worker的嵌套属性,对吗?在您的经理模型中有一个名为Order的字段,它是从Worker子类化的。然而,您有一个表单,它的嵌套字段部分指向Worker而不是Manager,即实际具有Order字段的模型。这显然是不够的,因为公司还没有太多的:经理,你可能需要在公司模型中将其设置为有太多的:经理

您使用的是什么版本的Mongoid?因为我不认为使用references\u many是受鼓励的——这与您的问题无关,只是想探究您正在使用的版本。在华丽的Mongoid.org上的文档中,我了解到了这一点,我不得不用艰苦的方式学习,他们说要更新记录,需要将自动存储集设置为true。那不准确。你甚至需要它来创造

因此:

增加:


我在重新阅读您的代码时,发现了以下问题:您的公司模型设置为has_many:workers,并且设置为在发生更改时接受Worker的嵌套属性,对吗?在您的经理模型中有一个名为Order的字段,它是从Worker子类化的。然而,您有一个表单,它的嵌套字段部分指向Worker而不是Manager,即实际具有Order字段的模型。这显然是不够的,因为公司还没有太多的:经理,你可能需要在公司模型中将其设置为有太多的:经理

更新至mongoid 2.2.1并添加了自动保存问题,但问题仍然存在。我认为这与这样一个事实有关:嵌套属性认为它需要为工人填充属性,而它需要为经理填充属性。我不确定是否有解决方法。是的,这是个问题,但有很多;管理器不是我一直在寻找的一种以多态方式确定类类型的最佳解决方案。我要问的问题与mongoid有关,而不是与active record有关。更新为mongoid 2.2.1并添加了autosave,但问题仍然存在。我认为这与这样一个事实有关:嵌套属性认为它需要为工人填充属性,而它需要为经理填充属性。我不确定是否有解决方法。是的,这是个问题,但有很多;管理器不是我一直在寻找的一种以多态方式确定类类型的最佳解决方案。我问的问题与mongoid有关,而不是与active record有关。好的,我离解决方案更近了。将字段_用于:工人,工人。将随我的进度更新问题我想我走错了方向。我相信问题变成了,使用单表继承的模型可以使用嵌套属性大量填充吗?我更接近于一个解决方案。将字段_用于:工人,工人。将随我的进度更新问题我想我走错了方向。我认为问题是,使用单表继承的模型是否可以使用嵌套属性大量填充