SQL arel select 中的函数,没有 activerecord 实例化

SQL function in arel select without activerecord instantiation

我想从 ::ActiveRecord_Relation 中得到一个 SQL 结果作为散列,因为实例化实际的 ActiveRecord objects 非常慢。通常我使用 pluck 然后将结果压缩到散列中:

keys = [:name, :created_at]
hash = relation.pluck(*keys).map{|row| Hash[*keys.zip(row).flatten]}

但是我需要的查询有SQL功能,比如:

SELECT name, UNIX_TIMESTAMP(created_at) - 3600 as hour_before_created FROM ...

我可以使用 Arel 的 select:

rel = rel.select("name", "UNIX_TIMESTAMP(created_at) - 3600 as hour_before_created)")
hash = rel.as_json(except: :id)

给出了正确的输出,但不幸的是实例化了 ActiveRecord objects。

在不实例化 ActiveRecord objects 的情况下,从每个 as 子句中获取具有适当 headers 的散列的正确方法是什么?

我已经做到了;它不漂亮,但它有效。 执行此类操作的最简单方法是建立和 ActiveRecord 关系,但不是查询数据库,而是对其调用 to_sql。然后做:

ActiveRecord::Base.connection.execute(sql)

(我想不通,欢迎指正)

returns 一个您可以使用 Model.column_names 压缩的数组或您实际选择的任何列的数组。

不确定如何在 Arel 上 to_sql,但我想这是可能的。