RoR 3创建发票应用程序 – 如何为HABTM发票/产品关联创建表单?

我正在尝试制作发票申请表。 以下是与我的问题相关的模型:

更新:由于最近的建议,模型信息已更改

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 

Invoice 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

中的p

p.tax_included%>

$

首先,如果您明确希望在其中包含具有附加属性的连接模型,则应使用has_many :through而不是has_and_belongs_to_many 。 请参阅RoR指南,了解两者的不同之处。

其次,没有单一的解决方案可以达到您的目标。 我看到有两个典型的用法,取决于可能的实例的质量,一个比另一个更好:

  1. 使用单选按钮选择(和取消选择)应创建或删除关系的位置。 参见railscast#165如何做到这一点。
  2. 您可以使用带有按钮的选择菜单来添加关系。 见railcast#88 。 添加的关系可以显示在列表中,附近有删除按钮。
  3. 使用标记字段(请参阅railscast#258 )在一个文本输入字段中自动完成多个条目。

在所有情况下,您通常必须在最后检查,如果

  • 应该删除一个关系
  • 不停
  • 或创建

我希望有些想法能为您提供适合您问题的解决方案。