问题
I finally figured out how to implement Dynamic Select menus using this tutorial.
Everything works, But how does one organize the Cities in the Dropdown by Name....
Below is all of the code I've written. (Please let me know if you need any further information)
New to rails please help :)
VIEWS
<%= simple_form_for ([@book, @rating]) do |f| %>
<div class="field">
<%= f.collection_select :state_id, State.order(:name), :id, :name, {:include_blank=> "Select a State"}, {:class=>'dropdown'} %>
</div>
### I would like the order of the cities displayed in the drop down to be alphabetized
<div class="field">
<%= f.grouped_collection_select :city_id, State.order(:name), :cities, :name, :id, :name, {:include_blank=> "Select a City"}, {:class=>'dropdown'} %>
</div>
<% end %>
回答1:
Option 1: In your City model, add a default scope that directs cities to be returned in alphabetical order:
# app/models/city.rb
default_scope :order => 'cities.name ASC'
Collections of City objects will, by default, be returned in alphabetically by name.
Option 2: Define a named scope in your State model that returns cities in alphabetical order as an association on a State object:
# app/models/state.rb
scope :cities_by_name, -> { cities.order(name: :asc) } # Rails 4
scope :cities_by_name, cities.order("name ASC") # Rails 3
Then, pass your scoped query to your grouped_collection helper:
f.grouped_collection_select :city_id, State.order(:name), :cities_by_name, :name, :id, :name, {:include_blank=> "Select a City"}, {:class=>'dropdown'}
回答2:
With Rails 4 :
# app/models/city.rb
scope :ordered_name, -> { order(name: :asc) }
# app/models/state.rb
has_many :cities, -> { ordered_name }
回答3:
How about using default_scope with ordering for City model?
Or creating a State scope like that:
scope :ordered_cities, ->{ cities.order(:name) }
and than changing your select to
f.grouped_collection_select :city_id, State.order(:name), :ordered_cities, :name, :id, :name, {:include_blank=> "Select a City"}, {:class=>'dropdown'}
回答4:
If using Rails 5.X, you can use default_scope, in which the syntax is slightly different than in @zeantsoi answer.
default_scope { order('cities.name ASC') }
回答5:
Like others in this thread, I had issues getting this to work with scope. Instead I got this working in Rails 5 by adding another association to the State model:
has_many :cities_by_name, -> { order(:name) }, class_name: 'City'
来源:https://stackoverflow.com/questions/20754942/grouped-collection-select-alphabetical-order-rails