26493


`ticker`と`name`というカラムを持つ`Company`モデルがあり、  
`ticker`に完全一致するか`name`に部分一致する物を取り出したいので

[code]

    Company.where('ticker=? OR name ilike ?', str, "%#{str}%")
    
[/code]

としてるのですが、`ticker`に完全一致するものを先頭にもってきたいと思っています。

はじめは検索クエリが2回走ってしまうことを無視して

[code]

    Company.where(ticker: str) + Company.where('name like ?',"%#{str}%")
    
[/code]

としようかと思ったのですが、これでは`Array`を返すのでPaginationの処理でこけてしまいました。

このように複数条件を`OR`検索する時に  
一つ目の条件に一致するものを先頭に持ってくるという処理に一般的な方法はありますか？


CC BY-SA 3.0
2016-06-04T22:25:18.293
25458
2016-06-06T04:04:18.040
3271
question
ruby-on-rails rails-activerecord
OR検索にて一つ目の条件に一致するものをふたつ目の条件よりも前に表示したい


SQL の `CASE WHEN ... THEN ... END` を使って `order` にべた書きするくらいしか解決策は無さそうです。

[code]

    Company
      .where('ticker = ? OR name ilike ?', str, "%#{str}%")
      .order(%{
        CASE WHEN ticker = #{Company.sanitize str} THEN 0 ELSE 1 END,
        必要ならソート条件をここに追加
      })
    
[/code]

※ Pagination するなら、別のソート条件 (`id` や `name` など) を付けた方が良いです。


CC BY-SA 3.0
2016-06-06T04:04:18.040
26493
2016-06-06T04:04:18.040
76
25458
answer