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

关联预加载(Eager loading)导致touch选项失效问题问询

预加载时touch: true失效的原因及解决办法

核心原因

当使用includes进行预加载时,关联的MyModel和Comment实例都会被加载到内存中:

  • 通过comments_attributes更新评论时,Rails直接修改内存中的Comment对象并保存,此时touch: true仅会更新内存里MyModel的updated_at属性,但不会自动将这个变更同步到数据库。
  • 未使用预加载时,Comment是从数据库重新加载的,保存时touch: true会触发对MyModel的数据库更新语句,因此updated_at能被持久化。

解决办法

  • 手动同步内存变更:在update后调用model.save,强制将内存中更新的updated_at写入数据库:
    model = MyModel.includes(comments: :user).find_by!(my_id: 111)
    params = {"comments_attributes"=>{"0"=>{"id"=>"2", "name"=>"aaa"}}}
    model.update(params)
    model.save
    
  • 显式触发touch:直接调用model.touch更新数据库中的updated_at字段:
    model.update(params)
    model.touch
    
  • 按需预加载:如果业务不需要预加载关联,使用普通查询即可自动触发touch的数据库更新逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:45:23