Grouped Collection选择按字母顺序排列的Rails

时间:2013-12-24 04:36:59

标签: ruby-on-rails ruby simple-form grouped-collection-select

我终于找到了如何使用this tutorial实现动态选择菜单。

一切正常,但是如何按名称组织下拉列表中的城市......

以下是我编写的所有代码。 (如果您需要任何进一步的信息,请告诉我)

新的铁路请帮助:)

视图

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

5 个答案:

答案 0 :(得分:6)

选项1 :在City模型中,添加default scope,指示按字母顺序返回城市:

# app/models/city.rb
default_scope :order => 'cities.name ASC'

默认情况下,City个对象的集合将按名称按字母顺序返回。

选项2 :在State模型中定义named scope ,按字母顺序返回城市,作为{{1}上的关联对象:

State

然后,将您的范围查询传递给# app/models/state.rb scope :cities_by_name, -> { cities.order(name: :asc) } # Rails 4 scope :cities_by_name, cities.order("name ASC") # Rails 3 帮助程序:

grouped_collection

答案 1 :(得分:5)

使用Rails 4:

# app/models/city.rb
scope :ordered_name, -> { order(name: :asc) }

# app/models/state.rb
has_many :cities, -> { ordered_name }

答案 2 :(得分:1)

如何使用default_scope订购City模型?

或者像这样创建State范围:

scope :ordered_cities, ->{ cities.order(:name) }

而不是将您的选择更改为

f.grouped_collection_select :city_id, State.order(:name), :ordered_cities, :name, :id, :name, {:include_blank=> "Select a City"}, {:class=>'dropdown'}

答案 3 :(得分:1)

如果使用Rails 5.X,则可以使用default_scope,其语法与@zeantsoi答案中的语法略有不同。

default_scope { order('cities.name ASC') }

答案 4 :(得分:0)

与此线程中的其他人一样,我在使用范围时遇到了问题。相反,我通过在State模型中添加另一个关联来使其在Rails 5中工作:

has_many :cities_by_name, -> { order(:name) }, class_name: 'City'