You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 23:12:12