6

我有这样的事情:

class Suite < ActiveRecord::Base
  has_many :tests
end

class Test < ActiveRecord::Base
  belongs_to :suite
end

我正在使用 cache_digests gem 来进行片段缓存。我希望当我更新套件对象时,子测试缓存过期。我试图touch: truehas_many关联中添加一个但没有成功。

我怎样才能做到这一点?

提前致谢


编辑

我在做我的缓存是这样的:

<% cache test do %>
  <tr>
   etc...
    <% cache test.suite do %>
      etc..
    <% end %>
  </tr>
<% end %>

但它不起作用,因为当我编辑一个套件时,他们的测试没有被触及。因此,我将缓存声明更改为如下内容:

<% cache [test, test.suite] do %>
   etc..
<% end %>

它按预期工作。

当我编辑一个测试或一个套件时,其中一个被触及,所以片段过期了,我得到了预期的新版本。

感谢@taryn-east 的帮助。

4

5 回答 5

4

你是对的,对人际关系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但是,您可以在更新资产应该更新的对象的方法中添加一些额外的逻辑。但这开始变得混乱。

于 2014-03-25T22:56:32.580 回答
3

本页: 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
于 2013-02-26T00:14:13.240 回答
2

改变你的片段缓存策略,使用类似:

<% cache [test, test.suite] do %>

我在评论中找到了这个答案。我只是想表明这是“答案”。

于 2017-05-11T03:44:20.660 回答
-2

你需要添加

autosave: true 

如果您想强制父母更新孩子,请在 has_many 关联上。touch 用于更新子 -> 父。

于 2013-07-21T04:49:20.687 回答
-5

试试这个

    class Suite < ActiveRecord::Base
      has_many :tests
    end

    class Test < ActiveRecord::Base
      belongs_to :suite, :touch => true
    end
于 2013-09-23T10:39:23.477 回答