ActiveRecord的选择与参数绑定

问题描述:

我想使用子查询用ActiveRecord就像这样:ActiveRecord的选择与参数绑定

User.select(
    'users.*, 
    (select sum(amount) 
     from subscriptions 
     where subscriptions.user_id = user.id 
     and created_at < ?) as amt)' 
).order('amt') 

然而,在倒数第二行,我有我无法弄清楚如何绑定的问题Time类参数,因为ActiveRecord::Baseselect方法不接受多个参数(sql字符串)。我该怎么办?

您可以使用ActiveRecord::Sanitization class methods之一。

这些混合成ActiveRecord::Base和几乎所有的保护,因此它们被你的模型定义一个类的方法最容易访问:

class User < ActiveRecord::Base 
    def self.select_with_args(sql, args) 
    query = sanitize_sql_array([sql, args].flatten) 
    select(query) 
    end 
end 

这也是值得寻找其他方式来获取你的数据,并比较它们性能到子查询方法。例如,您可以使用单独的查询获取订阅计数:

subs_by_user = Subscription.group(:user_id).where('created_at < ?', d).count() 
+1

这不会阻止在db适配器中使用准备好的语句缓存吗?看起来像http://apidock.com/rails/ActiveRecord/Sanitization/ClassMethods/sanitize_sql_array只是将当前值插入到语句中。 – qix