2017-07-31 13 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

cool feature called split_part文字列を分割し、指定した位置に単語を取得することができますPostgresにあります。

私はlast_nameが2番目の位置にあると信じているので、SQLの構文はこのようになります。いくつかミスすることができので、ここで、私はあなたのenvにはアクセスできません

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

が、私はあなたのアイデアを得たことを確認したかった:

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

ActiveRecord構文が見えるようになるだろう。

希望します。

+1

あなたは 'select'二重引用符を逃しました:' select( "id、name、split_part(name、 ''、2)last_name") '。 – Gerry

+1

ノートのためにありがとう –

+0

美しい。大文字小文字のソートを取り除くために少し修正しました: 'Client.select(" id、name、split_part(LOWER(name)、 ''、2)as last_name ")。order(" last_name ")'。私はこの反応が多くの人に役に立つと思う、なぜ私はすべてのdownvotesを確認していないのですか? –

関連する問題