Rails Postgres Order by case
Rails
PostgreSQL
AREL trick
campaigns = Campaign.arel_table foos = campaigns[:status].in(%w(foo bar)) cars = campaigns[:status].in(%w(car dar far)) case_statement = Arel::Nodes::Case.new .when(foos).then("foo") .when(cars).then("car") .else(campaigns[:status]) .desc Campaign.order(case_statement) Campaign.order(case_statement).to_sql
SELECT "campaigns".* FROM "campaigns" ORDER BY CASE WHEN "campaigns"."status" IN ('foo', 'bar') THEN 'foo' WHEN "campaigns"."status" IN ('car', 'dar', 'far') THEN 'car' ELSE "campaigns"."status" END DESC