HHH v4

Rails Postgres Order by case

Edit
equivalent Web Development
Public
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