使用现有子项创建父项

时间:2014-09-11 17:29:10

标签: ruby-on-rails nested-attributes

是否有人知道如何使用现有子项创建新父级?

class Order < ActiveRecord::Base
  has_many :jobs
  accepts_nested_attributes_for :jobs
end

class Job < ActiveRecord::Base
  belongs_to :quote
  belongs_to :order
end

使用嵌套变量,我可以使用新订单(父级)构建一个或多个作业(子级),然后create方法会自动使用新的子级创建新父级。我所拥有的是一组现有的孩子(在报价中创建的工作),我想将它们包含在新的父表格中。点击提交以创建新订单时,我希望它创建新的父订单,并使用新的父ID更新所选的子订单。

我有一些混乱的代码,它会在create方法中通过保存新订单(父级)来执行此操作,然后使用新的order_id更新每个作业(子级),但有没有办法自动执行此操作?


实际代码很复杂,所以这就是它的关键。

假设有一个包含多个作业的引用,因此所有这些作业中的quote_id变量都指向引号和@ quote.jobs =这些作业的数组。

这就是我现在所拥有的:

在Order模型中,我添加了:

attr_accessor :quote_id

在订单控制器中:

def new quote_id
  @quote = Quote.find(quote_id)
  @order = Order.new

并在视图中

<%= simple_form_for @order, :html => { :class => 'form-horizontal' } do |f| %>
  <%= f.input :quote_id, value: @quote.id, as: :hidden %>
  <%= f.input :account_number %>
  ...
  <table>
    <thead><tr> ... column headings here ... </tr></thead>
    <tbody>
      <% @quote.jobs.each do |q| %>
        <tr>
          <td><%= q.description %></td>
          <td><%= q.price %></td>
        </tr>
      <% end %>
      <tr><%= ... add a row with the total price ... %></tr>
    </tbody>
  </table>

  <%= f.button :submit, "Place My Order" %>
<% end $>

然后在订单控制器中

def create
  ...
  if @order.save
    Quote.find(params[quote_id]).jobs.each do |job|
      job.update(order_id: @order.id)
    end
  end
  ...

我更喜欢将作业参数作为表单中的嵌套对象处理,以便可以使用order.id和其他几个参数在Order创建时自动更新它们。我试过(在控制器中)

@order = Order.new
@quote.jobs.each do |job|
  @order.jobs << job
end

但它们没有以通常的嵌套格式显示,如果可行,我不知道它们是否真的会更新。

1 个答案:

答案 0 :(得分:0)

由于订单接受作业的嵌套属性,我认为您可以在构建订单时手动创建并填充嵌套作业字段(作为隐藏字段)。

<% @quote.jobs.each_with_index do |job, index| %>
  <input type='hidden' name='order[jobs_attributes][<% index %>][FIELDNAME]' id='order_jobs_attributes_<% index %>_FIELDNAME' value='<% job.something %>' />
<% end %>

我确定使用simple_form / form帮助程序可以使用= f.input构建隐藏字段,但我确实在上面懒惰!