2017-07-31 114 views
-1

我有一大组@clients,我想按客户端的姓氏排序,但似乎无法使其工作。我需要select:name:id来加速查询。Rails使用自定义方法排序

@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

你会得到什么错误?你会得到什么结果? –

+0

您应该让数据库使用'order'进行排序。不要在ActiveRecord :: Relation上使用'sort',尤其是如果速度是一个问题。另外:http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ –

+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") 

我有你无包膜访问,所以在这里可以进行一些错误,但我想,以确保你有这个想法。

希望它有帮助。

+1

您错过了'select'双引号:'select(“id,name,split_part(name,'',2)as last_name”)'。 – Gerry

+1

感谢您的留言 –

+0

美丽。我稍微修改以摆脱基于事例的排序:'Client.select(“id,name,split_part(LOWER(name),'',2)as last_name”)。order(“last_name”)'。我认为这个回应会对很多人有所帮助,我不确定为什么会有所有的降价? –