实际上,我如何从Rails中的控制器调用控制器?

时间:2015-01-16 21:26:32

标签: ruby-on-rails caching controller

好的,好的,从表面上看,这似乎是一个非常糟糕的主意,而且大部分时间都是如此。它不是MVC,它创建了潜在的奇怪依赖关系,并且它没有遵循良好的关注逻辑分离。

现在让我解释导致我提出这个问题的情况。我们有第三方api。出于性能原因,我们必须长时间缓存它。有时他们会更改数据,我们需要立即反映。我们已经给它们一个api端点来清除缓存(因为我们不会因为各种原因而让他们访问我们的内部缓存)。我需要一些方法来重温缓存。重温他们的api电话很容易。但是,我们有视图片段缓存依赖于该数据,我也希望对这些缓存进行复温。

基本上我想缓存在第二个控制器上调用期间通常会缓存的所有内容。但是,尝试此操作会导致第二个控制器调用超时。有没有办法实现这一点,或者是一种替代方法,它将导致所有必要的元素(包括使用rails片段缓存的视图元素)被缓存?

2 个答案:

答案 0 :(得分:0)

看起来您的真正问题是破坏碎片缓存。为什么不使用自我破坏缓存键。如果您使用cache 'key' do...缓存视图的某个部分,则“键”字符串可以由模型或诸如Post.count之类的东西更新。例如,在API控制器中将帖子列表缓存为JSON列表:

# your api controller's index action
@post_json = Rails.cache.fetch "posts-#{Post.count}-#{Post.order(:updated_at).last.updated_at}" do
  Post.all.to_json
end

现在您已经缓存了一系列帖子并准备作为API响应发送,并且您正在使用自我破坏缓存键,您不必担心手动“复位”缓存。每当创建新帖子或更新一个帖子时,缓存键都会有所不同,因为countupdated_at(对于最近更新的帖子)会有所不同并导致Rails.cache.fetch方法执行块,重新启动缓存。

使用这种动态缓存键,您可以使用任何方法来更新它,而不需要调用控制器(这非常困难,不推荐)。

答案 1 :(得分:0)

为了解决Rails维护单个连接的问题,您可以使用多线程方法:

Thread.new do
    # do stuff here
end