用于创建与嵌套模型的多对多关系条目的表单

时间:2012-09-19 17:20:15

标签: ruby-on-rails forms database-design many-to-many has-many-through

我的应用程序包含以下五个模型: 超市可以有不同的类别产品,这些类别中的产品可以由多个品牌生成。< / p>

现在我希望在我的超市 -form中有一个(或两个)选择 -field,我可以在类别中选择一个元素显示其名称以及 Brand 中的一个或多个元素,其名称显示,因此可以存储在 Origin

我想我可以使用collection_select,但我如何在此处使用它?

class Supermarket < ActiveRecord::Base
  has_many :supplies
  has_many :origins, :through => :supplies
end

class Supply < ActiveRecord::Base  
  belongs_to :origin  
  belongs_to :supermarket  
end

class Origin < ActiveRecord::Base
  belongs_to :category
  belongs_to :brand
end

class Category < ActiveRecord::Base
  has_many :origins
end

class Brand < ActiveRecord::Base
  has_many :origins
end

可能我还需要调整模型......


修改

澄清表格的结果应该是:

在编辑超市的表单中,我想选择产品的类别和相应的品牌,以便我知道,哪个 以及此类别中的品牌在此特定超市中出售

超市(表格):

超市的名称: Walmart


类别(选择一项):

  • 可乐(Category_ID 1)
  • Cornflakes (Category_ID 2)
  • ...

品牌(多选)

  • 可口可乐公司(Brand_ID 1)
  • PepsiCo (Brand_ID 2)
  • 凯洛格公司(Brand_ID 3)
  • ...

这应该在 Origin 中创建条目,如:

Supermarket_ID Category_ID Brand_ID 
      1            1          1 
      1            1          2 
      2            1          2 
      2            2          3 
     ...          ...        ... 

/修改


修改2

根据this question的答案,我可以创建或选择一个条目通过控制台,如下所示:

walmart = Supermarket.create(:name => "Walmart");
cornflakes = Category.create(:name => "Corn Flakes");
kellogs = Brand.create(:name => "Kellog's");

walmart.origins.create(:category_id => cornflakes, :brand_id = kellogs)

如何通过表单来使用此功能?我怎样才能使用selectcollection_select或者我还能使用其他帮手?

/编辑2

1 个答案:

答案 0 :(得分:0)

在使用多对多关系时,我也遇到过类似的问题。值得一看的宝石就是simple_form

他们为to_many关联提供了一个很好的表单帮助器。

在实际实现表单方面,我不确定我是否理解表单数据的使用方式。无论如何,javascript和虚拟属性都是你的朋友。

修改

啊,我明白你在说什么。我这样做的方法是创建一个select_field,选择类别,然后我会创建另一个select_field(设置:multiple =&gt; true),这样我就可以选择多个品牌。

<%= select_tag "supermarket[supplies][][category]" ... %>
<%= select_tag "supermarket[supplies][][brands]", ... %> <!-- be sure to set multiple to true !-->

接下来,您需要将所有内容关联起来。因此,我会创建一个处理表单提交的虚拟属性。例如:

def supplies=(supplies_hash)
# read supplies_hash and create the active records. 
end

def supplies

end

最后,如果你坚持这样做没有宝石,我建议你看一下nested form railscast.来了解所涉及的内容。