是否有人知道如何使用现有子项创建新父级?
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
但它们没有以通常的嵌套格式显示,如果可行,我不知道它们是否真的会更新。
答案 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
构建隐藏字段,但我确实在上面懒惰!