Rails:有没有办法在初始化期间加载数据库信息?

时间:2017-10-11 14:59:43

标签: ruby-on-rails ruby heroku activerecord ruby-on-rails-5

我有一些很少更改的表。不幸的是,我需要在控制器中经常调用这些表,这会增加某些页面的加载时间。例如,在一个控制器中我有:

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上运行的方式加载数据库信息?

1 个答案:

答案 0 :(得分:1)

很遗憾,您没有指定表格的大小。 如果它们的大小适中,我会使用Rails.cache而不是记住控制器中的提取。

您可以在此处阅读更多详细信息:

https://devcenter.heroku.com/articles/caching-strategies#low-level-caching

顺便说一下,数据应该被记忆为类变量而不是实例变量(我也会存储Foo.all.to_a - 所以数组而不是AR关系)。
虽然我不建议这样做,因为我不确定Heroku多久可以重新加载应用程序。 而且肯定是hack和Rails.cache确实是实现这种缓存的更好方法。此外,它提供了一种无效的方法。