从Rails中的另一个控制器访问数据

时间:2014-07-28 15:17:17

标签: ruby-on-rails ruby

我是一名c#程序员,我最近开始在RoR工作。 我有一个控制器,它从外部源(虚拟机列表)中检索数据并将其保存到变量中。

@virtual_machine_list = SomeModule::get_virtual_machines

我有两个问题:

  1. 获取列表的过程很漫长,我怎么能只调用一次(类似于我猜的单例初始化)
  2. 如何从其他Controller的视图中检索此数据(未存储在数据库中)?
  3. 我有几种表格,我想在每一种表格中列出这份清单。

2 个答案:

答案 0 :(得分:1)

只需对模块进行修补并使用||= memoization技术。它基本上只有在变量不存在时才分配给变量。在这两种情况下,无论是否分配,它都会返回变量。

module SomeModule
  def self.cached_virtual_machines
    @@cached_virtual_machines ||= self.get_virtual_machines
  end
end

答案 1 :(得分:1)

听起来您希望在应用程序启动时加载一次这些数据并将其从所有控制器中获取?

初始化器非常适合这种情况。您可以使用以下内容创建config/initializers/virtual_machines.rb

Rails.application.config.virtual_machines = SomeModule::get_virtual_machines
然后

Rails.application.config.virtual_machines访问控制器中的值。

请注意,这确实会对您有所限制。您的应用程序将开始变慢,因为它每次都需要加载此数据。如果您在生产中运行多进程配置,那可能是个问题。此外,如果数据过时,您无法刷新数据。

@ tadman建议将数据放入数据库是一个不错的选择。然后,您可以创建一个用于保持数据刷新的cron作业,并让初始化程序刷新数据库(如果数据库为空或过时)。