我有用户,场地和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
不幸的是,该范围并没有返回所有场地经理。任何输入都会对此表示赞赏。
为了使连接实际过滤,它必须是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 } }