Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails缓存与touch有很多关联_Ruby On Rails_Caching - Fatal编程技术网

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
只更新实际发生变化的孩子。嗨。我正试图为这种需求找到最好的解决方案。目前我正在对每一条记录进行更新,因此会触发回调,然后将更改传播到下一行。。。但是正在发生的事情(毫不奇怪)是,一次更新触发了对所有相关关联的更新,有许多关联+对该关联关联的更新-并且总体上变得越来越慢。在片段缓存上手动过期会使这更快吗?因此,不进行更新,而是直接过期。?