在DB中有效地存储/检索Rails应用程序的全局设置

时间:2011-02-14 18:54:04

标签: ruby-on-rails ruby-on-rails-3

我有许多全局应用程序设置,这些设置存储在DB中名为“settings”的表中。它有三列:id,key,value。

现在假设我有一个产品列表,其中列出了30个产品。显示这些产品中的每一个都需要从设置表中检索某个设置“汇率”。我这样做的方法是向应用程序帮助程序添加一个函数“exchange_rate”,它使用键“exchange rate”查找设置行并检索该值。

你可能会问,现在怎么了?好吧,没什么,它工作得很好,但当我按照开发服务器日志时,我注意到每个请求有30个这样的条目:

CACHE(0.0ms)SELECT settings。* FROM settings WHERE(settingskey ='exchange_rate')LIMIT 1

CACHE(0.0ms)SELECT settings。* FROM settings WHERE(settingskey ='exchange_rate')LIMIT 1

它看起来很丑陋,我的日志变得杂乱无章。原因很明显:DB条目被检索30次。它似乎没有任何数据库负载,因为它说CACHE,所以不应该有任何性能问题(或者有吗?我不知道)。

我的问题是:检索此全局变量(汇率)ONCE然后将其保存在某处(其中?)是否“更干净”更合理,这样我就不会看到这些看似多余的(虽然是缓存的)数据库请求?

1 个答案:

答案 0 :(得分:3)

是的,解决这个问题的最佳方法是将值存储在类变量中。例如:

class Settings
  def self.exchange_rate
    @@exchange_rage ||= (execute your SQL query and get the result here)
  end
end

这样,只要你调用Settings.exchange_rate,你就只会在第一次执行查询。其余的时间将使用@@ exchange_rate类变量。

在您的原始示例中,唯一的性能影响是SQL查询的生成和缓存的命中,因此它肯定存在,但并不像每次您想要汇率时实际访问数据库那么糟糕。 / p>