Ruby on rails Rails缓存与touch有很多关联
我有这样的想法:Ruby on rails Rails缓存与touch有很多关联,ruby-on-rails,caching,Ruby On Rails,Caching,我有这样的想法: class Suite < ActiveRecord::Base has_many :tests end class Test < ActiveRecord::Base belongs_to :suite end <% cache test do %> <tr> etc... <% cache test.suite do %> etc.. <% end %> <
class Suite < ActiveRecord::Base
has_many :tests
end
class Test < ActiveRecord::Base
belongs_to :suite
end
<% cache test do %>
<tr>
etc...
<% cache test.suite do %>
etc..
<% end %>
</tr>
<% end %>
<% cache [test, test.suite] do %>
etc..
<% end %>
但它不起作用,因为当我编辑一个套件时,他们的测试不会被触动。因此,我将缓存声明更改为如下内容:
class Suite < ActiveRecord::Base
has_many :tests
end
class Test < ActiveRecord::Base
belongs_to :suite
end
<% cache test do %>
<tr>
etc...
<% cache test.suite do %>
etc..
<% end %>
</tr>
<% end %>
<% cache [test, test.suite] do %>
etc..
<% end %>
等
它的效果和预期的一样
当我编辑一个测试或一个套件时,其中一个被触动了,因此,片段过期了,我得到了新版本,正如预期的那样
感谢@taryn east的帮助。本页:
建议使用后保存挂钩:
class Post < ActiveRecord::Base
has_many :assets
after_save -> { self.touch }
end
class Asset < ActiveRecord::Base
belongs_to :post
end
class Post{self.touch}
结束
类别资产
您需要添加
autosave: true
如果你想强迫父母更新孩子的话,你会有很多联系。触摸用于更新子->父项。试试这个
class Suite < ActiveRecord::Base
has_many :tests
end
class Test < ActiveRecord::Base
belongs_to :suite, :touch => true
end
class Suitetrue
结束
你说得对,touch:true
不适用于有很多关系。您可以在保存后使用钩住并手动更新所有相关资产。例如
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
class PostUPDATE“assets”设置“updated_at”=“2014-03-25 22:37:55.208491”,其中“assets”。“post_id”[[“post_id”,2]]
结束
结束
类别资产
警告:这将在更新资源时绕过ActiveRecord,因此如果资源需要依次接触另一个对象,这将不起作用。但是,您可以在touch_assets
方法中添加一些额外的逻辑,该方法更新资产应该更新的对象。但这开始变得混乱起来。更改片段缓存策略,使用以下方法:
<% cache [test, test.suite] do %>
我在评论中找到了这个答案。我只想让大家明白这就是“答案”。hmmm。听起来这是一个更深层次的问题,因为这就是它“应该”的工作原理。也许gem没有正确安装/加载?愚蠢的问题,但你需要在某个地方“要求”它吗?奇怪,在理论上,不,不。无论如何事情(我相信)是我缓存了测试tr片段,并将套件放在里面。。。所以,我很可能在做相反的事情……好吧,我已经修好了!我改变了片段缓存策略,现在我使用了类似:
的东西,它的工作方式和预期的一样。我会接受你的回答,因为这是唯一的答案。谢谢你的帮助。谢谢-但是如果你的答案对你更有效的话,你可以添加你自己的答案-然后接受这个事实:)我很震惊没有人开玩笑说让Post触摸自己。为什么要记下这个@caarlos0说,他“试图触摸:在有很多关联中是正确的”,而不是在属于上,因为触摸在这种情况下不应该这样做。在这个解决方案中,一旦您更新了测试,它就会触动套件。OP想要的是在更新套件时触摸所有测试。换句话说,这是完全错误的。(我没有投反对票,但我很清楚。)autosave
只更新实际发生变化的孩子。嗨。我正试图为这种需求找到最好的解决方案。目前我正在对每一条记录进行更新,因此会触发回调,然后将更改传播到下一行。。。但是正在发生的事情(毫不奇怪)是,一次更新触发了对所有相关关联的更新,有许多关联+对该关联关联的更新-并且总体上变得越来越慢。在片段缓存上手动过期会使这更快吗?因此,不进行更新,而是直接过期。?