繁体   English   中英

Active Record查找记录基于另一个对象在第一个记录的关联中的包含

[英]Active Record find record based on another object's inclusion in an association of first record

我有用户,场地和VenueManager。

给定一个用户(current_user),我需要返回该用户是一个场所管理员的场所。

棘手的是,一个场所可以有多个场所管理员,而我遇到的问题是,返回的场所将仅包含一个场所管理员(即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实际过滤,它必须是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 } }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM