我想要一个 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的天才都想对此进行破解吗?:-)
这就是我会这样做的方式,但不幸的是,在旧版本的 Rails 中。也许在较新版本中有更好的方法可以做到这一点。
User.find(:all,
:include => :email_sessions,
:conditions => 'email_sessions.id IS NULL'
)
编辑:使用ARel:
User.includes(:email_sessions).where('email_sessions.id IS NULL')
[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