2012-11-20 125 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')