ActiveRecord按相关记录的数量查找

时间:2012-11-20 20:36:20

标签: ruby-on-rails activerecord arel

我想要一个ActiveRecord查询,让我返回所有 email_sessions 用户。这是我的模特:

class User
    has_many :email_sessions
end

class EmailSession
    belongs_to :user
end

在AR查询之后执行此操作非常简单,如下所示:

User.all.reject {|u| u.email_sessions.count > 0}

但它在计算上相当昂贵,因为它逐步通过每个用户来检查计数。我还希望在此之后使用 arel 将不同的 where 语句链接在一起。

任何ActiveRecord sooper天才想要解决这个问题? : - )

2 个答案:

答案 0 :(得分:1)

我就是这样做的,但不幸的是在旧版本的Rails中。也许在更新的版本中有更好的方法。

User.find(:all,
  :include => :email_sessions,
  :conditions => 'email_sessions.id IS NULL'
)

编辑:使用ARel:

User.includes(:email_sessions).where('email_sessions.id IS NULL')

答案 1 :(得分:0)

[64] pry(main)> User.all.reject {|u| u.trial_end_date == nil or u.email_sessions.count > 0}.count
=> 138
[65] pry(main)> User.where("users.id NOT IN(?) AND users.trial_end_date IS NOT NULL", EmailSession.group(:user_id).select(:user_id).map { |es| es.user_id }).count
=> 138