Rails下拉列表排序值

时间:2016-09-04 13:22:27

标签: ruby-on-rails postgresql sorting activerecord

我有一个数组正在填充视图(erb)文件中的下拉列表。我想让下拉列表中的值按值排序(它是名称列表Last,First ...只是希望它们按最后排序)。这就是我所拥有的:

    <% 
  if @users
    users_arr = []
    @users.each do |u| 
      users_arr << ["#{u.name}", u.id]

    end
  end

  first_selected_parent = @kid.users && @kid.users.first ? @kid.users.first.id : ""
  second_selected_parent = @kid.users && @kid.users.count > 1 ? @kid.users.last.id : ""
%>

我用Google搜索并试了很多东西,但还没弄清楚。谢谢!

2 个答案:

答案 0 :(得分:0)

你为什么在这里使用数组?使用内置的ActiveRecord::Collection对象,它们几乎像数组,但可以使用所有的ActiveRecord方法。这段代码:

User.all.order(:last_name => :desc)

抓取所有User条记录,然后按last_name字段降序对它们进行排序。您可以使用.each迭代结果:

@users = User.all.order(:last_name => :desc)
@users.each do |user|
  # do stuff
end

如果您尝试将HTML <select>元素填充为表单的一部分,请跳过所有奇怪的数组操作并使用Rails的表单助手:

<%= form_for @resource, url: form_submission_path do |f| %>
  <%= f.select :field_name, options_for_select(User.all.order(:last_name => :desc).map{|u| [u.last_name, u.id]}) %>
<% end %>

答案 1 :(得分:0)

最简单的答案是使用sort方法:     users_arr.sort

这将返回按每个条目的第一个元素排序的数组。

irb(main):129:0> users_arr
=> [["Watson", 1], ["Olson", 2], ["Peters", 3], ["Warren", 4]]
irb(main):130:0> users_arr.sort
=> [["Olson", 2], ["Peters", 3], ["Warren", 4], ["Watson", 1]]

您可以使用sort!对数组进行排序,或使用sort(不带!字符)来生成新的(已排序的)数组。

完整语法(例如,对每个条目的第二个元素进行排序)将使用<=>运算符:

irb(main):132:0> users_arr
=> [["Olson", 2], ["Peters", 3], ["Warren", 4], ["Watson", 1]]
irb(main):133:0> users_arr.sort {|a,b| a[1] <=> b[1]}
=> [["Watson", 1], ["Olson", 2], ["Peters", 3], ["Warren", 4]]