2014-01-20 68 views
0

的關聯我有用戶,場所和VenueManagers納入活動記錄找到記錄。基於另一個對象在第一個記錄

給定一個用戶(current_user),我需要返回這個用戶是venue_manager的場地。

有點棘手的是場地可以有多個場館經理,而我遇到的問題是,返回的場館只包含一個場館經理,即current_user,而不包含其他場地經理。

具體而言,這是一個範圍。

class Venue < ActiveRecord::Base 

    has_and_belongs_to_many :venue_managers 

    scope :for_venue_manager, -> (user) { includes(:venue_managers).where('venues_venue_managers.user_id = ?', user) } 

end 

不幸的是,該範圍並未返回所有場館經理。任何輸入麻煩理解。

回答

1

爲了使聯接實際過濾,它需要是joins而不是includes。所以,首先,你需要做

scope :for_venue_manager, -> (user) { 
     joins(:venue_managers).where('venues_venue_managers.user_id = ?', user) } 

這會給你這個用戶是經理之一的場地。有隻只有該用戶爲管理員的那些,然後你可以通過這些過濾誰只有1名經理:

scope :for_venue_manager, -> (user) { 
     joins(:venue_managers).where('venues_venue_managers.user_id = ?', user). 
     group(:venue_id).having('count(user_id) = 1') } 

或者,在軌

scope :for_venue_manager, -> (user) { 
     joins(:venue_managers).where('venues_venue_managers.user_id = ?', user). 
     filter {|v| v.venue_managers.length == 1 } } 
+0

偉大的答案,我會用' 。哪裏(venues_venue_managers:{USER_ID:user.id})'讓Rails的處理SQL書寫部 – MrYoshiji

+0

完美,感謝Alex和感謝MrYoshiji爲你補充。 – rfish26535