2014-01-08 34 views
2
class User < ActiveRecord::Base 
has_many :memberships 

# included columns 
# id: integer 

--------------------- 

Membership < ActiveRecord::Base 
belongs_to :user 

# included columns 
# user_id: integer 
# active: boolean 

我希望能夠抓住所有成員身份都爲'active = false'的所有用戶查詢。迄今爲止最好的,我已經能夠拿出的是:查詢所有特定記錄,其相關資源都具有相同的單個屬性值

#grab possibles 
users = User.joins(:memberships).where('memberships.active = false') 
#select ones that satisfy condition 
users.select{ |user| user.memberships.pluck(&:active).uniq == [false] } 

,因爲我必須使用紅寶石掐出有效的人是不是很大。

回答

0

這可以做的伎倆:

users_with_active_membership = User.joins(:memberships).where(memberships: { active: true }) 
users = User.where('users.id NOT IN (?)', users_with_active_membership.pluck(:id)) 

我不知道結果,但我希望它是2個嵌套查詢,一個選擇具有積極的成員的用戶ID,其他查詢選擇用戶不在此之前的ID列表中。

我無法測試它,因爲我沒有這些關係的環境。你可以嘗試它併發布SQL查詢生成? (添加.to_sql看到它)

另一種方式,我不知道這可能是最有效的:

User.where('users.id NOT IN (?)', Membership.where(active: true).group(:user_id).pluck(:user_id)) 
+0

這是一個偉大的射門,但仍然關閉觸發兩個查詢。目標是在單個查詢中進行連接和比較,而不必執行子查詢。我懷疑用「有」和「不在」混淆可能是訣竅。我改變了上面的問題描述,使用'pluck'進行小型優化,而不是使用map。感謝你的回答! –

相關問題