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 string) 。 我该怎么办?

您可以使用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 

同样值得寻找其他方法来获取数据并将其性能与子查询方法进行比较。 例如,您可以使用单独的查询来获取订阅计数:

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