我对 Rails 还是很陌生,并且相当确定我试图解决这个问题的方式效率低下或者只是简单的愚蠢,但这就是我想要完成的事情。我有 2 个模型,案例(患者案例文件)和库存(案例中使用的医疗移植材料)。
class Case < ActiveRecord::Base
has_many :inventories
accepts_nested_attributes_for :inventories, :reject_if => :all_blank
end
class Inventory < ActiveRecord::Base
belongs_to :case
end
清单是通过单独的流程创建的,目标是通过案例表单将它们与案例相关联。我想要做的是在我的案例表单上放置一个表格,其中列出了可用的库存以及复选框以选择所需的库存以与正在创建的案例相关联。由于我需要能够为每个 Inventory 上的几个属性包含嵌套字段(:case_price 和 :case_ship_price),这使情况变得更加复杂。我以前通过关联使用has_many 并将这些属性存储在数据透视表上以一种非常迂回的方式完成了此操作,但它涉及一些hacky 代码来捕获来自params 的字段输入,然后通过此块保存它们:
class CasesController < ApplicationController
def create
@case = Case.new(params[:case])
if @case.save
@case.case_lineitems.each do |li|
li.update_attributes(:price => params[:lineitem_price][li.inventory_id.to_s],
:shipping_cost => params[:lineitem_shipping][li.inventory_id.to_s])
end
redirect_to @case
else
render 'new'
end
end
end
这感觉非常笨拙,我担心它可能会导致问题,所以我想尝试一个简单的 has_many,belongs_to 关系。但是,我不确定典型的关系是否<%= check_box_tag :inventory_ids, inventory.id, @case.inventories.include?(inventory), name: 'case[inventory_ids][]' %>
适用于这种类型的关系。这是我表单的这一部分目前的样子:
<table>
<thead>
<tr>
<th></th>
<th>Product</th>
<th>Serial #</th>
<th>Price</th>
<th>Shipping</th>
</tr>
</thead>
<tbody>
<% @inventories.each do |inventory| %>
<tr>
<td>
<%= check_box_tag :inventory_ids, inventory.id, @case.inventories.include?(inventory), name: 'case[inventory_ids][]' %>
</td>
<td><%= inventory.product.name %></td>
<td><%= inventory.serial_num %></td>
<%= f.fields_for :inventories, inventory do |inv| %>
<td>
<%= inv.text_field :case_price %>
</td>
<td>
<%= inv.text_field :case_ship_price %>
</td>
<% end %>
</tr>
<% end %>
</tbody>
</table>
这导致第一个复选框默认为选中,如果我不选中所有复选框,则所有库存都会在提交时关联。仅检查子集会导致异常Couldn't find Inventory with ID=206 for Case with ID=
。最后,检查所有库存似乎可以正确保存关联和嵌套属性。
如何清理它以使其按需要工作?如果我需要通过关系返回到 has_many,是否有更好的方法将数据透视表上的属性保存在与数据透视表上创建行相同的表单上?我真的很感谢任何帮助,因为没有多少搜索让我摆脱了这个挑战。