如何用ActiveRecord查询归属指定Athlete的所有Travel记录
查询指定运动员的所有Travel记录方案
下面提供几种可行的ActiveRecord查询方式,无需原生SQL也能解决需求:
方法一:使用JOIN与OR条件
通过两次左关联参赛记录表,筛选出任意一个关联字段匹配指定运动员的Travel:
# 假设已获取目标运动员实例@athlete Travel.joins("LEFT JOIN competition_participations AS arrival_cp ON travels.arrival_competition_participation_id = arrival_cp.id") .joins("LEFT JOIN competition_participations AS departure_cp ON travels.departure_competition_participation_id = departure_cp.id") .where("arrival_cp.athlete_id = ? OR departure_cp.athlete_id = ?", @athlete.id, @athlete.id) .distinct # 避免同一Travel因同时关联该运动员多条参赛记录而重复
方法二:子查询+OR条件
先获取该运动员所有参赛记录的ID,再匹配Travel的两个关联字段:
# 获取目标运动员的所有参赛记录ID athlete_cp_ids = @athlete.competition_participations.pluck(:id) # 查询关联字段匹配ID的Travel,用OR合并两个条件 Travel.where(arrival_competition_participation_id: athlete_cp_ids) .or(Travel.where(departure_competition_participation_id: athlete_cp_ids))
这种方式逻辑更直观,ActiveRecord会自动生成正确的OR查询语句。
方法三:在Athlete模型中添加关联简化查询
如果需要频繁查询,可在Athlete模型中定义关联方法,后续调用更便捷:
class Athlete < ApplicationRecord has_many :competition_participations has_many :arrival_travels, through: :competition_participations, source: :arrival_travels has_many :departure_travels, through: :competition_participations, source: :departure_travels def all_travels # 合并两类旅行记录并去重 arrival_travels.union(departure_travels) end end
之后直接调用@athlete.all_travels就能获取该运动员关联的所有Travel记录。
内容的提问来源于stack exchange,提问作者Dennis Nedry
相关产品推荐
相关产品推荐

