不修改模型,带条件预加载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
相关产品推荐
相关产品推荐

