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

时间:2011-10-21 03:13:33

标签: ruby-on-rails ruby-on-rails-3 forms has-and-belongs-to-many

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

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

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%>

1 个答案:

答案 0 :(得分:0)

首先,如果您明确希望其中包含其他属性的联接模型,则应使用has_many :through而不是has_and_belongs_to_many。请参阅两者的RoR Guide to the differences

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

  1. 使用单选按钮选择(和取消选择)应创建或删除关系的位置。请参阅railscast #165如何执行此操作。
  2. 您可以使用带有按钮的选择菜单来添加关系。见railscast #88。添加的关系可以显示在列表中,附近有删除按钮。
  3. 使用令牌字段(请参阅railscast #258)在一个文本输入字段中自动填充多个条目。
  4. 在所有情况下,您通常必须在最后检查,如果

    • 应删除关系
    • 保持
    • 或创建

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