Rails控制台如何查询has_many through关联下指定用户的特定航司评论
问题
你配置了Rails中User、Airline、Review三个模型的多对多关联:
Airline:has_many :reviews,has_many :users, through: :reviewsUser:has_many :reviews,has_many :airlines, through: :reviewsReview:belongs_to :airline,belongs_to :user
现有种子数据如下:
singapore_airlines=Airline.create(name: 'Singapore Airlines') cathy=User.create(name:"Cathy",email:"cathy@jetsetgo.com",admin:false) Review.create(image:"https://worldofwanderlust.com/wp-content/uploads/2022/03/866D61D2-FFD1-4392-9596-0E4E372D18D9.jpg", date: DateTime.new(2021, 11, 1),destination:"Singapore to Tokyo",seat:"Business class",description:"If you want comforting long flights always take Singapore airlines",likes:0,dislikes:0,airline_id:singapore_airlines.id,user_id: cathy.id)
目前已知通过sing = Airline.find(1) + sing.reviews可以拿到新加坡航空的全部评论,需要筛选出指定用户(如Cathy)针对该航司发布的评论。
实现方法
三种常用写法,最终查询效果完全一致:
- 基于航司关联评论追加用户筛选
# 先拿到目标航司和目标用户对象 sing = Airline.find(1) cathy = User.find_by(name: "Cathy") # 链式加where条件即可 cathy_reviews_for_sing = sing.reviews.where(user_id: cathy.id)
- 基于用户关联评论追加航司筛选
cathy = User.find_by(name: "Cathy") sing = Airline.find(1) cathy_reviews_for_sing = cathy.reviews.where(airline_id: sing.id)
- 直接查询Review主表(适合多条件组合场景)
cathy = User.find_by(name: "Cathy") sing = Airline.find(1) cathy_reviews_for_sing = Review.where(user: cathy, airline: sing)
三种写法生成的SQL都会在
reviews表按user_id和airline_id做过滤,如果给这两个字段加联合索引,查询效率会更高。可以根据当前代码上下文选最简洁的写法即可,不需要额外加其他gem或者修改现有模型关联。
内容的提问来源于stack exchange,提问作者user13827741
相关产品推荐
相关产品推荐

