Rails关联查询:如何获取用户所属分组关联的全部Ticket记录
实现方案
你可以通过以下3种常见方式实现需求,按推荐度从高到低排序:
方案1:新增关联复用逻辑(最推荐)
直接在User模型中新增跨关联的has_many :through定义,一次定义后续可以随处调用,还会自动复用Group模型中tickets关联的排序规则:
class User < ActiveRecord::Base has_and_belongs_to_many :groups has_many :tickets, as: :assignable # 新增这一行关联定义 has_many :group_tickets, through: :groups, source: :tickets end
之后查询直接调用即可,返回的结果会自动按tickets.created_at排序:
# @user 为你指定的目标用户实例 @user.group_tickets
方案2:直接基于ID查询(最简单)
如果只是临时查询一次不想修改模型定义,可以直接用group_ids方法拿到用户所属分组ID列表,直接过滤Ticket:
Ticket.where(group_id: @user.group_ids)
Rails会自动将该逻辑转为SQL的IN查询,性能足够应付绝大多数场景。
方案3:连表查询(适合复杂过滤场景)
如果查询需要同时叠加Group或者User维度的过滤条件,可以用joins连表实现:
Ticket.joins(group: :users).where(users: { id: @user.id })
如果需要去重(极端场景下同一张Ticket可能因为多分组关联重复返回),可以在末尾追加.distinct即可。
内容的提问来源于stack exchange,提问作者cris
相关产品推荐
相关产品推荐

