Ruby on rails Rails 6:如何只加载一次全局变量?

Ruby on rails Rails 6:如何只加载一次全局变量?,ruby-on-rails,Ruby On Rails,我的应用程序使用全局变量,如徽标、应用程序名称等,从数据库中检索并显示在不同的控制器和视图上。我把它放在ApplicationController中以供所有人使用,但我发现个别控制器有时重复相同的查询 class ApplicationController < ActionController::Base $image = Setting.find_by_name('image').value $city = Setting.find_by_name('city').value

我的应用程序使用全局变量,如徽标、应用程序名称等,从数据库中检索并显示在不同的控制器和视图上。我把它放在ApplicationController中以供所有人使用,但我发现个别控制器有时重复相同的查询

class ApplicationController < ActionController::Base
  $image = Setting.find_by_name('image').value
  $city = Setting.find_by_name('city').value
  $currency = Setting.find_by_name('currency').value 
end
class ApplicationController

是否有一种方法可以使所有控制器(和用户)都可以使用相同的变量,只需一次性查询存储在内存中的变量,例如当应用程序启动时?

您可以尝试使用初始值设定项

服务器启动时,Rail将加载config/initializers/文件夹中的所有文件。这可以作为初始化应用程序范围变量的地方。我们可以在initializers目录中创建inventory.rb文件: 在config/initializers/inventory.rb处

module Inventory
  class Count
    Orders = Order.all
  end
end

Inventory::Count::Orders
# =>  "[your orders will show here]"

当服务器启动或重新启动时,这些文件只会加载一次。因此,如果您所需的值不会更改,那么这种方法很有效。如果它们会改变,我不认为有什么好方法可以避免运行多个查询。

缓存是什么?Rails使用SQL缓存,您可以使用低级缓存。请参阅指南(1.7和1.8):

“但我发现个别控制器有时会重复相同的查询”-让我猜猜,这是在开发模式下发生的,在您更改控制器中的某些内容之后?这是为您重新加载代码。