環境
やりたいこと
例えば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メソッドを使って特定の値で並び替えることができます。