【问题标题】:Filling out an inherited mongoid document using nested attributes使用嵌套属性填写继承的 mongoid 文档
【发布时间】: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


【解决方案1】:

您使用的是什么版本的 Mongoid?因为我认为不鼓励使用 referenceeneces_many - 这与您的问题无关,只是想探究您使用的版本。在华丽的 Mongoid.org 上的文档中,得到这个,我不得不以艰难的方式学习它,他们说要更新你的记录,你需要将 autossave 设置为 true。这不准确。您甚至需要它来创建

所以:

class Company
  include Mongoid::Document

  has_many :workers, :autossave => true # your money shot
  accepts_nested_attributes_for :workers
  attr_accessible :workers_attributes
end

添加:

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

【讨论】:

  • 更新到 mongoid 2.2.1 并添加自动保存问题仍然存在。我认为这与嵌套属性认为它需要填充工作人员的属性时需要填充经理的属性这一事实有关。我不确定是否有解决方法。
  • 是的,这就是问题所在,但 has_many ;managers 并不是我一直在寻找一种通过多态方式确定类类型的最佳解决方案。我要问的问题与 stackoverflow.com/questions/2553931/… 与 mongoid 而不是活动记录有关。
猜你喜欢
  • 1970-01-01
  • 2020-01-19
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多