6

我想像这样使用 ActiveRecord 的子查询:

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

但是,在倒数第二行,我无法弄清楚如何绑定Time类参数,因为ActiveRecord::Base'select方法不接受多个参数(sql 字符串)。我该怎么办?

4

1 回答 1

9

您可以使用其中一种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()
于 2012-10-25T07:31:16.747 回答