如何查找与指定User共享至少一个Genre的Concert实例?
解决方案
方法1:高效关联查询(推荐)
直接利用ActiveRecord的关联链式调用,避免N+1问题,同时保证查询效率:
在User模型中添加方法:
class User < ApplicationRecord has_and_belongs_to_many :genres def concerts_with_shared_genres Concert.joins(:genres) .where(genres: { id: genre_ids }) .distinct end end
调用方式:
user = User.find(1) user.concerts_with_shared_genres
关键说明:
joins(:genres)建立Concert与Genre的关联,生成SQL JOIN语句where(genres: { id: genre_ids })筛选出关联了用户所属任意流派的演出distinct去重,避免同一个演出因关联多个匹配流派而重复返回
方法2:子查询实现
如果需要更灵活的条件组合,可使用子查询方式:
def concerts_with_shared_genres Concert.where(id: Genre.where(id: genre_ids).joins(:concerts).select(:concert_id)) end
方法3:优化可读性(显式定义反向关联)
若频繁使用这类查询,可在Genre模型中显式定义反向关联(HABTM默认会生成,但显式定义更清晰):
class Genre < ApplicationRecord has_and_belongs_to_many :users has_and_belongs_to_many :concerts end
之后可通过用户关联直接查询:
Concert.joins(:genres).where(genres: { users: { id: user.id } }).distinct
内容的提问来源于stack exchange,提问作者Mars Fields
相关产品推荐
相关产品推荐

