我有用户,场地和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
不幸的是,该范围并未归还所有场地经理。任何意见都表示赞赏。
答案 0 :(得分: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') }
或者,在rails
中 scope :for_venue_manager, -> (user) {
joins(:venue_managers).where('venues_venue_managers.user_id = ?', user).
filter {|v| v.venue_managers.length == 1 } }