通过中间表关联查询跨模型记录: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
相关产品推荐
相关产品推荐

