主动记录根据另一个对象的包含在第一个记录的关联中查找记录



我有用户,场地和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 } }

相关内容

最新更新