关联预加载(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
相关产品推荐
相关产品推荐

