How to create an array for grouped_options_for_select based on models

Product belogs_to categories. Has_many products category

I need a select tag that includes an optgroup tag.

Basically, I need my HTML markup for something similar to pseudo code:

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

Based on my models, how can I generate an array for placement in grouped_options_for_select ? For example, what's the best approach to creating grouped_options ?

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

Controller:

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

View:

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

For Rails 4

Model:

 class Category < ActiveRecord::Base has_many :products end class Product < ActiveRecord::Base belongs_to :category end 

Controller:

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

View:

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

I use mongoid and I added "everything" to get all models first

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

All Articles