我有一些很少更改的表。不幸的是,我需要在控制器中经常调用这些表,这会增加某些页面的加载时间。例如,在一个控制器中我有:
class PagesController < ApplicationController
def index
@groups = Group.all
@events = Event.all
end
end
然后我发现,由于组和事件很少发生变化,我可以将这些变量加载到初始化器中或作为模型中的常量加载,这样他们实际上就不需要查询数据库了。我将上面的内容改为以下内容:
class Group < ApplicationRecord
ALL = Group.all
end
class Event < ApplicationRecord
ALL = Event.all
end
class PagesController
def index
@groups = Group::ALL
@events = Event::ALL
end
end
上述解决方案实际上在开发中有效。但是,在Heroku的生产中,它会在控制器中加载变量。我还尝试设置初始化程序并定义::Groups = Group.all
,但在控制器中调用时仍会加载数据。有没有办法在初始化期间以一种可以在Heroku上运行的方式加载数据库信息?
答案 0 :(得分:1)
很遗憾,您没有指定表格的大小。
如果它们的大小适中,我会使用Rails.cache
而不是记住控制器中的提取。
您可以在此处阅读更多详细信息:
https://devcenter.heroku.com/articles/caching-strategies#low-level-caching
顺便说一下,数据应该被记忆为类变量而不是实例变量(我也会存储Foo.all.to_a
- 所以数组而不是AR关系)。
虽然我不建议这样做,因为我不确定Heroku多久可以重新加载应用程序。
而且肯定是hack和Rails.cache
确实是实现这种缓存的更好方法。此外,它提供了一种无效的方法。