Ruby on rails 对ruby hashmap进行排序

Ruby on rails 对ruby hashmap进行排序,ruby-on-rails,ruby,ruby-on-rails-4,hashmap,Ruby On Rails,Ruby,Ruby On Rails 4,Hashmap,我有下面一行代码 <% map = options_for_select(User.all.map {|u| [u.first_name+" "+u.last_name, u.id]}) %> 它获取用户的名字和姓氏,并在表单中提交其ID。现在我已经添加了一些用户,它们不是按字母顺序排列的。如何按名字对地图进行排序?可能是 <% map = options_for_select(User.all.map {|u| [u.first_name+" "+u.last_n

我有下面一行代码

<% map = options_for_select(User.all.map {|u| [u.first_name+" "+u.last_name, u.id]}) %>

它获取用户的名字和姓氏,并在表单中提交其ID。现在我已经添加了一些用户,它们不是按字母顺序排列的。如何按名字对地图进行排序?

可能是

   <% map = options_for_select(User.all.map {|u| [u.first_name+" "+u.last_name, u.id]}.sort) %>

您还可以使用
order
从数据库中获取已排序的行:

<% map = options_for_select(User.all.order(:first_name).map {|u| [u.first_name+" "+u.last_name, u.id]}) %>

出于性能原因,我建议您在数据库中同时执行CONCAT和ORDER

User.select("CONCAT(u.first_name, ' ', u.last_name), u.id").order("u.first_name")

用户.all.map
可能是应用程序的瓶颈

您永远不应该对视图使用查询。您应该仅将视图用于表示,以及模型和/或控制器上的所有逻辑

此外,关于:

实际上,这可能需要一系列不同类型的重构,但归结起来只有一个想法:将与响应无关的任何逻辑(例如,设置flash消息,或选择是否重定向或渲染视图)移动到模型(而不是控制器),您不仅在可能的情况下促进了重用,而且还使在请求上下文之外测试代码成为可能

最后,在这种情况下,最好使用一个作用域来在以后重用它

在用户模型上使用作用域,并具有
名称
方法:

class User < ActiveRecord::Base
  scope :order_by_name, ->(first_name, last_name) { order("#{first_name} ASC, #{ last_name} ASC") }

  def name
    "#{first_name} #{last_name}"
  end
end
然后,您可以使用来自集合的选项来调用视图,以进行选择,如下所示:

class UsersController < ApplicationController
  def index
    @users = User.order_by_name
  end
end
<% map = options_from_collection_for_select(@users, :id, :name) %>


该死的是。。。我在括号后尝试了
.sort
。。。对不起,新到rails。。。谢谢你,伙计!根据我的经验(我开始学习Rails,对Ruby一无所知……),学习Ruby解决了我们在开发Rails应用程序时面临的大多数问题。所以试试这种方法吧,它节省了我们很多时间,让我们对Ruby更加好奇。太棒了!是的,我现在正在学习琳达的红宝石课程。问题是,有时将方法放在哪个顺序似乎很奇怪。i、 e.在这里把排序放在哪里Killerpixler在使用这一行时要小心,就像在你的视图中那样。这是可行的,但您同时违反了几个Rails最佳实践:)请参阅此处可能更好的方法,尤其是当数据库在用于排序的属性上有索引时,可能会更有效。@DaniëlKnippers是的,非常正确。(对任何事情)都有更好的方法。但它们只有在得到证明后才会更好。你如何证明这一点?我很想看看我愿意采用它的证据。@Bala如果数据库在
name
属性上有一个索引,它就已经知道了顺序(就我所知,索引总是被排序的,否则它有点毫无意义),所以它可以按排序顺序从磁盘检索数据并返回。您的散列必须在之后通过将所有元素相互比较来进行排序,因此速度应该较慢。可能对少量数据不明显,但如果可能,应首选在数据库级别进行排序。不过,我不确定没有索引的情况,可能不会太重要。@DaniëlKnippers如果数据库是NoSQL(如Neo4j)怎么办?OP没有提出这些限制。思考过多有时会限制简单的解决方案。你同意吗?@Bala我认为Rails实际上不支持Activerecord模型的NoSQL数据库,我认为它只适用于关系数据库。也许有解决办法。此外,我知道有支持索引的NoSQL数据库,比如MongoDB。无论如何,我并不是说你的答案是错误的,只是指出在数据库级别使用顺序很可能是相同的或更快的。