我正在尝试制作发票申请表。以下是我的模型,与我的问题相关:
更新:由于最近的建议,模型信息已更改
Invoice
> id
> created_at
> sales_person_id
LineItem
> id
> invoice_id
> item_id
> qty_commit (inventory only)
> qty_sold
> price (because prices change)
> ...etc
Item
> barcode
> name
> price
> ...etc
发票has_many items, :through => :line_items
。项目同上。我想要做的是,当我创建新发票时,我希望表单中包含所有可用的项目。我不想要填充所有项目的唯一时间是我正在查看发票(因此只应检索LineItems表中存在的项目)。目前 - 显然 - 新发票没有任何物品。当集合中当前没有任何内容时,如何列出它们,以及如何填充表单?此外,我希望所有产品在创建失败时可用(以及用户通过表单选择的内容)。
更新:我可以通过控制器通过以下方式创建项目:
@invoice = Invoice.new
#使用所有产品填充发票,以便选择它们 Item.where(“stock>?”,0).each do | i |
@ invoice.items.new(i.attributes)
端
这当然是我做我想做的粗暴尝试。在视觉上它效果很好,但是正如我预测的那样,当我真正尝试保存模型时,我的表单ID并没有很好地发挥作用。
LineItem(#37338684)预期,得到数组(#2250012)
表格的一个例子:
#f是form_for
<%@ invoice.items.group_by {| p | p.category} .each do | category,products | %GT;
<%= category.name%>
<%= f.fields_for:line_items do | line_item | %GT;
<%表示产品中的p%>
<%= line_item.hidden_field:tax_included,:value => p.tax_included%>
<%= p.name%>
$<%= p.price%>
<%end%>
<%end%>
<%end%>
答案 0 :(得分:0)
首先,如果您明确希望其中包含其他属性的联接模型,则应使用has_many :through
而不是has_and_belongs_to_many
。请参阅两者的RoR Guide to the differences。
其次,没有单一的解决方案可以达到您想要的目标。我看到有两个典型的用法,取决于可能的实例的质量,一个比另一个更好:
在所有情况下,您通常必须在最后检查,如果
我希望有些想法能为您找到适合您问题的解决方案。