0

我想要一个 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 天才都想尝试一下吗?:-)

4

2 回答 2

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')
于 2012-11-20T21:12:47.827 回答
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
于 2012-11-20T20:52:44.050 回答