2017-07-31 164 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」)'。我認爲這個迴應會對很多人有所幫助,我不確定爲什麼會有所有的降價? –