Rails cache_digests触摸has_many关联
我有这样的事情:
class Suite < ActiveRecord::Base has_many :tests end class Test < ActiveRecord::Base belongs_to :suite end
我正在使用cache_digests gem来进行片段缓存。 我希望在更新Suite对象时,子测试缓存过期。 我试图touch: true
在has_many
协会中没有成功。
我怎样才能做到这一点?
提前致谢
编辑
我这样做我的缓存:
etc... etc..
但它不起作用,因为当我编辑套件时,他们的测试没有被触及。 所以,我将缓存声明更改为:
etc..
它的效果与预期一致。
当我编辑测试或套件时,其中一个被触及,因此,片段已过期,我按预期获得了新版本。
感谢@ taryn-east的帮助。
本页: https : //github.com/rails/rails/issues/8759
建议使用after_save钩子:
class Post < ActiveRecord::Base has_many :assets after_save -> { self.touch } end class Asset < ActiveRecord::Base belongs_to :post end
你是对的, touch: true
对has_many
关系不起作用。 您可以使用after_save
挂钩并手动更新所有关联的资产。 例如…
class Post < ActiveRecord::Base has_many :assets after_save :touch_assets def touch_assets assets.update_all(updated_at: Time.now) # This does a single SQL call, but bypasses ActiveRecord in the process. See warning below. # SQL> UPDATE "assets" SET "updated_at" = '2014-03-25 22:37:55.208491' WHERE "assets"."post_id" [["post_id", 2]] end end class Asset < ActiveRecord::Base belongs_to :post end
警告:更新资产时会绕过ActiveRecord,因此如果资产需要依次触摸另一个对象,则无效。 但是,您可以在touch_assets
方法中添加一些额外的逻辑,以更新资产应该更新的对象。 但这开始变得混乱。
更改片段缓存策略,使用如下内容:
<% cache [test, test.suite] do %>
我在评论中找到了这个答案。 我只是想明确这是“答案”。
你需要添加
autosave: true
如果您想强制父母更新孩子,请在has_many关联上。 touch用于更新child – > parent。
试试这个
class Suite < ActiveRecord::Base has_many :tests end class Test < ActiveRecord::Base belongs_to :suite, :touch => true end