如何通过has_many :through关联结合Enum查询活跃用户?
解决Location关联用户查询活跃状态的问题
有几种简洁的实现方式,可满足直接查询地点活跃用户的需求:
方法一:定义带条件的关联(推荐)
在Location模型中新增一个关联,直接绑定该地点下的活跃用户:
class Location < ApplicationRecord has_many :memberships has_many :users, through: :memberships # 通过memberships的active状态关联用户 has_many :active_users, through: :memberships, source: :user, -> { where(memberships: { status: :active }) } end
使用时直接调用:
Location.first.active_users
该方式会自动生成带memberships.status = 'active'条件的查询,且ActiveRecord会自动处理用户去重。
方法二:扩展关联实现users.active调用
如果希望严格使用Location.first.users.active的写法,可以通过关联扩展实现:
class Location < ApplicationRecord has_many :memberships has_many :users, through: :memberships do def active where(memberships: { status: :active }) end end end
调用时直接执行:
Location.first.users.active
逻辑封装在Location模型的关联扩展中,调用方式完全符合需求。
方法三:通过User模型scope配合查询
在User模型中添加基于会员状态的scope:
class User < ApplicationRecord has_many :memberships scope :active, -> { joins(:memberships).where(memberships: { status: :active }) } end
查询时需添加distinct避免重复(同一用户在单地点下不会重复,但全局场景下需注意):
Location.first.users.active.distinct
内容的提问来源于stack exchange,提问作者vince
相关产品推荐
相关产品推荐

