我有一大堆@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>, ...]>
答案 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")
我无法访问您的环境,所以这里可能会有一些错误,但我想确保您有这个想法。
希望它有所帮助。