我想在ActiveRecord中使用子查询,如下所示:
User.select(
'users.*,
(select sum(amount)
from subscriptions
where subscriptions.user_id = user.id
and created_at < ? ) as amt)'
).order('amt')
Run Code Online (Sandbox Code Playgroud)
但是,在倒数第二行,我有一个问题,我无法弄清楚如何绑定Time
类参数,因为ActiveRecord::Base
's select
方法不接受多个参数(sql字符串).我该怎么办?
您可以使用其中一种ActiveRecord::Sanitization
类方法.
它们被混合ActiveRecord::Base
并几乎全部受到保护,因此通过在模型上定义类方法可以最轻松地访问它们:
class User < ActiveRecord::Base
def self.select_with_args(sql, args)
query = sanitize_sql_array([sql, args].flatten)
select(query)
end
end
Run Code Online (Sandbox Code Playgroud)
同样值得寻找其他方法来获取数据并将其性能与子查询方法进行比较.例如,您可以使用单独的查询来获取订阅计数:
subs_by_user = Subscription.group(:user_id).where('created_at < ?', d).count()
Run Code Online (Sandbox Code Playgroud)