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 |