2012-11-20 94 views
0

我想一个ActiveRecord的查询,让我返回所有用户具有零个email_sessions号找到。我这里还有我的模型:的ActiveRecord的相关记录

class User 
    has_many :email_sessions 
end 

class EmailSession 
    belongs_to :user 
end 

这将是非常直截了当的AR查询后,要做到这一点,像这样:

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

但它得到它的步骤是相当大计算昂贵通过每个用户来检查计数。我也想用arel来链接不同的其中后面的陈述。

任何ActiveRecord sooper天才想要在这个? :-)

回答

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 
+2

维克多被欺骗了一下,因为我和他一起工作,他上的实际数据进行测试。此解决方案完美运作。 –

+0

问题是为什么当Victor在那里时,你必须在SO上发帖? :) –

+0

此外,甚至没有匹配的问题。 至少要编辑这个问题来匹配这个问题,所以将来有人可以理解它。 – rking

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')