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

Ruby on rails 从Rails中的另一个控制器访问数据,ruby-on-rails,ruby,Ruby On Rails,Ruby,我是一名c#程序员,最近开始在RoR工作。 我有一个从外部源(虚拟机列表)检索数据并将其保存到变量中的控制器 @virtual_machine_list = SomeModule::get_virtual_machines 关于这一点,我有两个问题: 获取列表的过程很长,我怎么能只调用一次(我想类似于单例初始化) 如何从其他控制器的视图中检索此数据(未存储在数据库中) 我有几个表单,我想在每个表单中显示此列表。只需对模块进行修补,并使用|124;=记忆技术即可。它基本上只在变量不存在时才赋值给

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

@virtual_machine_list = SomeModule::get_virtual_machines
关于这一点,我有两个问题:

  • 获取列表的过程很长,我怎么能只调用一次(我想类似于单例初始化)
  • 如何从其他控制器的视图中检索此数据(未存储在数据库中)

  • 我有几个表单,我想在每个表单中显示此列表。

    只需对模块进行修补,并使用
    |124;=
    记忆技术即可。它基本上只在变量不存在时才赋值给变量。在这两种情况下,无论是否赋值,它都返回变量

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

    听起来您想在应用程序启动时加载此数据一次,并使其可从所有控制器使用

    一个初始化器很适合这个。您可以使用以下内容创建
    config/initializers/virtual_machines.rb

    Rails.application.config.virtual_machines = SomeModule::get_virtual_machines
    
    然后从
    Rails.application.config.virtual\u machines
    访问控制器中的值

    请注意,这确实在一定程度上限制了您。您的应用程序将启动较慢,因为它每次都需要加载此数据。如果在生产环境中运行多进程配置,这可能是一个问题。此外,如果数据过时,您也无法刷新它


    @塔德曼建议将数据放入数据库是一个不错的选择。然后,您可以创建一个cron作业来保持数据的刷新,如果数据库是空的或过时的,您可以让初始值设定项刷新数据库。

    为什么不将其保存在数据库中,这样您就有了一个持久缓存?将其保存在内存中是不可靠的,因为Rails进程将在应用程序的运行时启动和退出,另外,多个进程同时运行是很常见的。它们不共享变量或任何未在用户会话或某种数据库中持久化的状态。