19550


あるクラスのカラムの内容を加工してその結果をもとに並び替えをしたいのですが、orderに渡す引数がそのクラスのカラム名でないとエラーになってしまいます。何か方法があるでしょうか？

例えば、phoneticというカラムに、カブシキガイシャアイウエオ という値が入っている場合、そのアイウエオという文字列で並び替えをしたいのです。

どうぞ宜しくお願い致します。


CC BY-SA 3.0
2015-12-02T03:37:42.590
19539
2015-12-02T08:16:04.317
13484
question
ruby-on-rails
rails4 加工したカラムの値で並び替えをするには？


一度`Model.all`で全件読み出してから、ソートすることはできますが処理速度の問題でおすすめしません。

`phonetic_for_order`や`short_phonetic`などのカラムを新しく作成して、そのカラムにインデックスを付けて`order`を使い並び替えするのが良いんじゃないでしょうか。


CC BY-SA 3.0
2015-12-02T08:06:43.730
19549
2015-12-02T08:06:43.730
3271
19539
answer


単純に「カブシキガイシャ」を削れば良いのであれば、

[code]

    .order("replace(phonetic, 'カブシキガイシャ', '')")
    
[/code]

でいいのですが、真ん中当たりに「カブシキガイシャ」が含まれるレコードがあると意図しないソート結果になります。

RDBによっては正規表現を用いた置換関数がありますので、それであれば「先頭の文字列だけを対象に置換することもできます。

[code]

    .order("regexp_replace(phonetic, '^カブシキガイシャ', '')")
    
[/code]

条件指定が複雑にになりますし、ソート条件に関数使うと抽出対象が多いときにパフォーマンスの問題も出るかもしれません。

一応アプリケーション側でソートする方法もあります。classが`ActiveRecord::Relation`でなくなってしまいますし抽出対象が多いときには明らかに遅くなります。

[code]

    Model.where(...).sort_by {|c| c.speaking_to.sub(/^カブシキガイシャ/,'') }
    
[/code]

可能であれば、

  * データの方をいじって前株後株を削る
  * 別にソート用のカラムを作る

のを検討した方がいいです。


CC BY-SA 3.0
2015-12-02T08:16:04.317
19550
2015-12-02T08:16:04.317
5793
19539
answer