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

时间:2015-01-19 18:23:11

标签: ruby-on-rails activerecord arel

我希望从::ActiveRecord_Relation获取SQL结果作为哈希,因为实例化实际的ActiveRecord对象非常慢。通常我使用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对象。

使用每个as子句中的相应头文件获取哈希的正确方法是什么,而不实例化ActiveRecord对象?

1 个答案:

答案 0 :(得分:2)

我做到了这一点;它不漂亮但它有效。 做这样的事情的最简单方法是make和ActiveRecord关系,但不是查询db,而是调用to_sql。然后做:

ActiveRecord::Base.connection.execute(sql)

(这是我的头脑;欢迎更正)

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

不确定如何在Arel上使用to_sql,但我认为这是可能的。