ruby-on-rails - 有没有在 Arel NamedFunction 节点中使用 ORDER BY 的干净方法?

标签 ruby-on-rails rails-activerecord arel

我正在使用 ActiveRecord 4.2/Arel 6.0/Postgres 并有以下输入:

  • 来自 Arel::TableArel::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 顺序订购的干净方式。您使用的语法与我不同,但看起来这就是您要寻找的。

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/

相关文章:

ruby-on-rails - 从 1 月 1 日到 12 月 31 日,获取一年中星期一列表的最佳方法是什么

javascript - 如何使用 Backbone 生态模板中的自定义模型功能?

ruby-on-rails - 按关系过滤 Active Record,但不按关系本身过滤

ruby-on-rails - 如何创建一个基于实例方法的值对对象进行排序的类/作用域方法?

ruby-on-rails - 在 Rails 3 上使用计算进行分组查询

ruby-on-rails - Rails i18n : "fr" is not a valid locale

ruby-on-rails - 使用 selenium-client 单击作为表单一部分的按钮

ruby-on-rails - AssociationTypeMismatch 错误中的数字代表什么?

ruby-on-rails - 在 Rails activerecord 中使用 where 子句和 join 子句

ruby-on-rails - 使用 Arel 表达 CTE