動かざることバグの如し

近づきたいよ 君の理想に

Railsで特定のレコードを先頭にしてソートする方法

環境

やりたいこと

例えばRailsのUsersモデルで10件レコードを取得し、emailが"hoge@example.com"のレコードを先頭にしたいみたいな状況

この場合はRubyで並び替えてもいいが、MySQLのORDER BYで特定のレコードのみを先頭にすることができる。

やりかた

下記のように書くと、emailが"hoge@example.com"のレコードが先頭になります。

users = User.limit(10).order("case when email = 'hoge@example.com' then 0 else 1 end")

この場合、case文を使ってemailが"hoge@example.com"のときは0、そうでないときは1を返すようにしています。そして、0と1で昇順に並び替えることで、emailが"hoge@example.com"のレコードが先頭になります。

もし、他のカラムでも並び替えたい場合は、orderメソッドに続けて指定することができます。例えば、idで降順に並び替えたい場合は、下記のように書きます。

users = User.limit(10).order("case when email = 'hoge@example.com' then 0 else 1 end, id DESC")

このようにorderメソッドを使って特定の値で並び替えることができます。

参考リンク