我正在使用 ActiveRecord 4.2/Arel 6.0/Postgres 并有以下输入:
- 来自
Arel::Table
的Arel::Attributes::Attribute
(column
) - 几个
Arel::Nodes::Ordering
节点(orders
)
我想用一个聚合函数构建一个 Arel::Nodes::NamedFunction
,该聚合函数包含 Attribute
指定的列并按 Ordering 排序
节点。
生成的 SQL 可能类似于:
array_agg("posts"."id" ORDER BY "posts"."published_at" DESC)
我目前的解决方案是首先构建一个Arel::Nodes::SelectStatement
,向其中添加列和订单,将其转换为SQL,去除前导SELECT
关键字,将其包装在 Arel::Nodes::SqlLiteral
中并将其传递给 NamedFunction
节点:
select = Arel::Nodes::SelectStatement.new
select.cores.last.projections << column
select.orders = orders
sql = select.to_sql.sub(/^SELECT /, '')
literal = Arel::Nodes::SqlLiteral.new(sql)
array_agg = Arel::Nodes::NamedFunction.new('array_agg', [literal])
显然,这是一个巨大的黑客攻击。
将 ORDER BY
保留在聚合函数之外不是一种选择,因为它会与用于聚合的 GROUP BY
冲突。
那么有没有一种更简洁的方法可以在不滥用 SelectStatement
/SelectManager
的情况下实现这一目标?
最佳答案
我不知道这是否适合您,但我发现这是一种按 DESC 顺序订购的干净方式。您使用的语法与我不同,但看起来这就是您要寻找的。p>
arel = Post.arel_table
query = arel.project(Arel.select('*'))
query.order(arel[:published_at].desc).to_sql
这是我对您正在尝试做的事情的最佳猜测。
关于ruby-on-rails - 有没有在 Arel NamedFunction 节点中使用 ORDER BY 的干净方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36390357/