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

不修改模型,带条件预加载Rails嵌套关联的实现方案

解决方案

直接通过preload结合lambda实现需求,无需修改任何模型:

def find_facilities(organization)
  organization.facilities.preload(
    doctors: -> { joins(:calendar).includes(:calendar) }
  )
end

原理说明

  • preload支持为关联传入lambda作为查询条件,这个lambda会直接作用于doctors关联的查询逻辑:
    • joins(:calendar)通过内连接过滤掉没有对应日历的医生,精准实现“仅加载拥有日历的医生”的要求;
    • includes(:calendar)会预加载这些医生的日历对象,避免后续访问doctor.calendar时触发N+1查询,同时确保日历数据被加载完成。
  • 整个实现完全在查询层面完成,不需要给模型添加任何额外的scope或关联,严格保持模型原有结构。
  • 由于日历表拥有指向医生的外键,Doctor.joins(:calendar)的关联逻辑完全适配Doctor has_one :calendar、Calendar belongs_to :doctor的关联关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:26:18