0

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

现在我想在我的超市表单中有一个(或两个)选择字段,我可以在其中选择一个出现名称的类别中的元素和出现名称的品牌中的一个或多个元素,所以这可以存储在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

可能,我还必须调整模型......


编辑

为了澄清表格的结果应该是什么:

在编辑超市的表格中,我想选择一个产品类别和相应的品牌,以便我知道该类别中的哪些类别哪些品牌在这个特定的超市中出售:

超市(表格):

超市名称:沃尔玛


类别(选择一项):

  • 可乐(Category_ID 1)
  • 玉米片(Category_ID 2)
  • ...

品牌(多选)

  • 可口可乐公司(Brand_ID 1)
  • 百事可乐(Brand_ID 2)
  • 家乐氏公司(Brand_ID 3)
  • ...

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

超市_ID Category_ID Brand_ID
      1 1 1
      1 1 2
      2 1 2
      2 2 3
     …………

/编辑


编辑 2

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

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

4

1 回答 1

0

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

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

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

编辑:

啊,我明白你在说什么。我这样做的方法是创建一个 select_field,用于选择类别,然后我将创建另一个 select_field(设置:multiple => 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

最后,如果您坚持在没有 gem 的情况下执行此操作,我建议您查看嵌套形式 railscast。了解所涉及的内容。

于 2012-09-19T17:29:12.933 回答