Active Record根据另一个对象包含在第一条记录的关联中查找记录

时间:2014-01-20 21:09:07

标签: ruby-on-rails ruby activerecord

我有用户,场地和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 个答案:

答案 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 } }