質問: `ticker`と`name`というカラムを持つ`Company`モデルがあり、 `ticker`に完全一致するか`name`に部分一致する物を取り出したいので ``` Company.where('ticker=? OR name ilike ?', str, "%#{str}%") ``` としてるのですが、`ticker`に完全一致するものを先頭にもってきたいと思っています。 はじめは検索クエリが2回走ってしまうことを無視して ``` Company.where(ticker: str) + Company.where('name like ?',"%#{str}%") ``` としようかと思ったのですが、これでは`Array`を返すのでPaginationの処理でこけてしまいました。 このように複数条件を`OR`検索する時に 一つ目の条件に一致するものを先頭に持ってくるという処理に一般的な方法はありますか?
回答: SQL の `CASE WHEN ... THEN ... END` を使って `order` にべた書きするくらいしか解決策は無さそうです。 ``` Company .where('ticker = ? OR name ilike ?', str, "%#{str}%") .order(%{ CASE WHEN ticker = #{Company.sanitize str} THEN 0 ELSE 1 END, 必要ならソート条件をここに追加 }) ``` ※ Pagination するなら、別のソート条件 (`id` や `name` など) を付けた方が良いです。