Rails使用自定义方法排序

时间:2017-07-31 21:15:55

标签: ruby-on-rails sorting

我有一大堆@clients,我希望按客户的姓氏排序,但我似乎无法让它正常工作。我需要select :name:id来加快查询速度。

@clients = Client.all.select(:name, :id)

@clients.sort { |a, b| a.name && b.name ? a.name.split(" ").last[0] <=> b.name.split(" ").last[0] : a ? -1 : 1}

我得到的结果是:

#<ActiveRecord::Relation [#<Client id: 460, name: "Jim Jimmy">, #<Client id: 440, name: nil>, #<Client id: 231, name: "Paigetest Doyle">, #<Client id: 441, name: "Jeremy Lopez">, #<Client id: 462, name: "blah blah">, #<Client id: 348, name: "Jan Aldrich">, #<Client id: 464, name: "fefw fewfew">, #<Client id: 466, name: nil>, #<Client id: 67, name: "Jeremy Lopez">, #<Client id: 449, name: nil>, ...]>

1 个答案:

答案 0 :(得分:2)

Postgres中有一个cool feature called split_part,允许分割字符串并在指定位置获取该字词。

我相信last_name位于第二个位置,因此SQL语法看起来像这样。

SELECT *, split_part(name, ' ', 2) AS last_name FROM clients ORDER BY last_name;

ActiveRecord语法将如下所示:

Client.select("id, name, split_part(name, ' ', 2) as last_name").order("last_name")

我无法访问您的环境,所以这里可能会有一些错误,但我想确保您有这个想法。

希望它有所帮助。