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,但我想这是可能的。
我想从 ::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,但我想这是可能的。