Rails Arel 如何分组 select

Rails Arel how group by select

我想先用 select 添加属性,然后按它们排序。

label = Arel.sql(
    %q(
        case label
        when 'x' then 1
        when 'y' then 2
        end
    )
)

Item.all.select("*, 'x' as label").order(label)

错误:

ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR:  column "label" does not exist)
LINE 2:       case label

很难想象最终结果应该是什么。您说 GROUP BY,但我看不到您要分组的内容。我猜你实际上不需要这样做。如果您想这样做,您也可以按多列排序。

如果你必须使用Arel

Item.select(
      Arel.star, 
      Arel::Nodes::Case.new(Item.arel_table[:column_name]) 
       .when('x').then(1)
       .when('y').then(2)
       .as('label'))
    .order('label')

否则只用普通字符串,不需要用Arel

包起来
Item.select("*")
    .select("CASE items.column_name WHEN 'x' THEN 1 WHEN 'y' THEN 2 END AS label")
    .order('label')

执行SELECT中的逻辑,然后按结果排序。