Ruby on rails 将数据库查询保存到变量

Ruby on rails 将数据库查询保存到变量,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我已经建立了一个简单的“设置”模型,这样我就可以创建一些用户可修改的全局设置,我可以在整个应用程序中使用这些设置。 此模型具有var\u name和value列。var\u name是主键 我可以使用Setting.find('my\u variable\u name')访问这些文件,该方法有效,但每次都会导致数据库查询 我希望能够将设置“缓存”一次,而不是每次都查询数据库。 我不确定该怎么做,我还是Rails新手 我设想在我的应用程序控制器中使用类似于settings=Setting.all的

我已经建立了一个简单的“设置”模型,这样我就可以创建一些用户可修改的全局设置,我可以在整个应用程序中使用这些设置。 此模型具有
var\u name
value
列。
var\u name
是主键

我可以使用
Setting.find('my\u variable\u name')
访问这些文件,该方法有效,但每次都会导致数据库查询

我希望能够将设置“缓存”一次,而不是每次都查询数据库。
我不确定该怎么做,我还是Rails新手

我设想在我的应用程序控制器中使用类似于
settings=Setting.all
的方法将所有设置放入一个变量中,然后创建一种从中操作单个变量的方法-使用类似于
settings.my_variable\u name的方法调用它。
…但我不知道如何:)


如有任何建议,将不胜感激。谢谢。

尝试将其添加到您的设置模型中

class Setting < ActiveRecord::Base
  def self.fetch(name)
    fetch_all.detect { |s| s.var_name == name }
  end

  def self.fetch_all
    @fetch_all ||= Setting.all
  end

  def self.reload_all!
    @fetch_all = Setting.all
  end
end
然后可以使用
setting.fetch('domain').value#=>“google.com”
获取设置

Settings.fetch('domain')    #=> Hits the database with Settings.all
Settings.fetch('subdomain') #=> Hits the results in @fetch_all
Settings.fetch('domain')    #=> Hits the results in @fetch_all

@fetch_all | |=all
将调用
设置。第一次
设置时调用all
。调用fetch_all
并将结果存储在
@fetch_all
中。后续调用将使用存储在
@fetch\u all

中的结果,尝试将其添加到设置模型中

class Setting < ActiveRecord::Base
  def self.fetch(name)
    fetch_all.detect { |s| s.var_name == name }
  end

  def self.fetch_all
    @fetch_all ||= Setting.all
  end

  def self.reload_all!
    @fetch_all = Setting.all
  end
end
然后可以使用
setting.fetch('domain').value#=>“google.com”
获取设置

Settings.fetch('domain')    #=> Hits the database with Settings.all
Settings.fetch('subdomain') #=> Hits the results in @fetch_all
Settings.fetch('domain')    #=> Hits the results in @fetch_all

@fetch_all | |=all
将调用
设置。第一次
设置时调用all
。调用fetch_all
并将结果存储在
@fetch_all
中。后续调用将使用存储在
@fetch\u all

Works中的结果。在我看来似乎很优雅。谢谢虽然由于我将
var\u name
作为主键,我需要将代码的第3行从
s.var\u name
更改为
s.id
,但实际上,当您更新数据库中的一个变量时,fetch方法将返回旧值。如何获取新值?您可以添加一个名为
self.refresh
的新方法,该方法执行
@fetch\u all=Settings.all
。在我看来似乎很优雅。谢谢虽然由于我将
var\u name
作为主键,我需要将代码的第3行从
s.var\u name
更改为
s.id
,但实际上,当您更新数据库中的一个变量时,fetch方法将返回旧值。如何获取新值?您可以添加一个名为
self.refresh
的新方法,该方法执行
@fetch\u all=Settings.all