关于Rails上的ruby:ActiveRecord按关联记录数查找

ActiveRecord find by number of associated records

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

1
2
3
4
5
6
7
class User
    has_many :email_sessions
end

class EmailSession
    belongs_to :user
end

在AR查询之后执行此操作非常简单,就像这样:

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

但是随着逐步检查每个用户来检查计数,它在计算上变得非常昂贵。在此之后,我还想使用arel将不同的where语句链接在一起。

任何ActiveRecord天才的人都想对此进行破解吗? :-)


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

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

编辑:使用ARel:

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


1
2
3
4
[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