2011-05-11 31 views
4

产品belogs_to类别。 类别has_many的产品如何根据模型为grouped_options_for_select生成数组

我需要一个包含optgroup标签的选择标签。

所以基本上,我需要我的HTML标记相似的伪代码的东西:

<select name="product" class="products"> 
    <option value=""></option> 
    <optgroup label="Cheese"> 
    <option value="1">cheese 1</option> 
    <option value="2">cheese 2</option> 
    <option value="3">cheese 3</option> 
    </optgroup> 
    <optgroup label="Juices"> 
    <option value="3">juice 1</option> 
    <option value="4">juice 2</option> 
    <option value="5">juice 3</option> 
    </optgroup> 
</select> 

根据我的模型,我将如何产生的阵列投入grouped_options_for_select?例如,生成grouped_options的最佳方法是什么?

<%= select_tag 'product', grouped_options_for_select(grouped_options), :include_blank => true , :id => nil, :class => 'product' %> 

回答

12

控制器:

@products = Product.all(:include => :category) 
@grouped_options = @products.inject({}) do |options, product| 
    (options[product.category.name] ||= []) << [product.name, product.id] 
    options 
end 

检视:

<%= select_tag 'product', grouped_options_for_select(@grouped_options), :include_blank => true , :id => nil, :class => 'product' %> 
+4

或'products.inject模型({ }){| options,product | options.merge(product.category_name => [product.name,product.id])}' – zetetic 2011-05-11 15:32:30

0

对于轨道4

型号:

class Category < ActiveRecord::Base 
    has_many :products 
end 

class Product < ActiveRecord::Base 
    belongs_to :category 
end 

控制器:

@grouped_options = Category.map { 
          |category| [category.name, 
          category.products.map { 
           |product| [product.name,product.id]}]} 

查看:

<%= select_tag(:product, options_for_select(@grouped_options))%> 
+1

您能否提供一些关于该解决方案为何起作用的内容? – aribeiro 2016-02-27 23:18:17

+0

我已经添加了模型,在DB中应该有一个名为'name'的字段。 – 2016-02-28 17:22:46

0

我使用mongoid和我添加 '所有' 来获取所有第一

@grouped_options = Category.all.map { 
         |category| [category.name, 
         category.products.map { 
          |product| [product.name,product.id]}]}