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

通过中间表关联查询跨模型记录:Rails模型关联技术问询

嘿,我完全懂你的困扰!Diagnosis和Prescription确实没有直接关联,但没关系——咱们可以借助它们共同绑定的Visit模型当“桥梁”,轻松拿到特定诊断下最常开具的药物数据。

解决方案思路

核心逻辑就是:通过Visit把Diagnosis和Prescription串联起来——一个Visit可以对应多个Diagnosis和多个Prescription,所以我们先找到所有包含目标Diagnosis的Visit,再统计这些Visit里出现的药物频次即可。

方法一:给模型加间接关联(Rails优雅风格)

先给Diagnosis模型添加上和Prescription的间接关联,后续查询会更顺手:

# app/models/diagnosis.rb
class Diagnosis < ApplicationRecord
  belongs_to :visit
  # 通过visit间接关联到prescriptions
  has_many :prescriptions, through: :visit
end

加完这个关联后,你就能直接通过某个diagnosis对象获取对应的所有处方了:

# 先拿到你要查询的特定诊断
target_diagnosis = Diagnosis.find(your_diagnosis_id)
# 获取该诊断关联的所有处方
related_prescriptions = target_diagnosis.prescriptions

接下来统计高频药物,只需要分组计数就行:

# 按药物名称分组,统计频次并降序排列
top_medications = target_diagnosis.prescriptions
                          .group(:medication_name) # 替换成你Prescription模型里实际存药物名的字段,比如drug_name
                          .order('count_all desc')
                          .count

如果只想取前N个高频药物(比如前5个),加个limit就行:

top_5_medications = target_diagnosis.prescriptions
                             .group(:medication_name)
                             .order('count_all desc')
                             .limit(5)
                             .count

方法二:直接写关联查询(无需修改模型)

要是不想动模型关联,直接写链式查询也能搞定:

# 替换your_diagnosis_id为目标诊断ID,medication_name为实际字段名
top_medications = Prescription.joins(visit: :diagnoses)
                              .where(diagnoses: { id: your_diagnosis_id })
                              .group(:medication_name)
                              .order('count_all desc')
                              .count

这个查询的逻辑是:从Prescription出发,关联到Visit再关联到Diagnosis,筛选出包含目标Diagnosis的所有处方,最后分组统计药物出现的次数。

补充小提示

  • 如果你的Prescription是关联到独立的Medication模型(比如belongs_to :medication),那统计的时候要关联到Medication表,比如:
top_medications = target_diagnosis.prescriptions
                          .joins(:medication)
                          .group('medications.name')
                          .order('count_all desc')
                          .count
  • 记得把代码里的字段名(比如medication_name)替换成你数据库里实际的字段,别直接抄哦!

这样就能轻松得到你想要的特定诊断下高频药物数据啦~

内容的提问来源于stack exchange,提问作者user1895399

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:28:00