我的应用程序包含以下五个模型: 超市可以有不同的类别产品,这些类别中的产品可以由多个品牌生成。< / 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
类别(选择一项):
品牌(多选)
这应该在 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)
如何通过表单来使用此功能?我怎样才能使用select
或collection_select
或者我还能使用其他帮手?
/编辑2
答案 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.来了解所涉及的内容。