2011-02-14 69 views
1

我有许多全局应用程序设置存储在数据库中的一个名为“settings”的表中。它有三列:id,key,value。在DB中高效地存储/检索Rails应用程序的全局设置

现在我们假设我有一个产品清单列出了30种产品。显示这些产品中的每一个需要从设置表中检索特定设置“交换率”。我做到这一点的方式是向应用帮助程序添加了一个函数“exchange_rate”,该函数用键“exchange rate”查找设置行并检索值。

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

CACHE(0.0ms)选择settings * FROM settings WHERE(settingskey ='。 EXCHANGE_RATE')LIMIT 1

CACHE(0.0ms)选择settings。* FROM settings WHERE(settingskey = 'EXCHANGE_RATE')LIMIT 1

它看起来非常丑陋和杂波我的日志。原因很明显:数据库条目被检索了30次。它似乎没有任何数据库负载,因为它说CACHE,所以不应该有任何性能问题(或者有 - 我不知道)。

我的问题是:它是“更干净”,更合理的检索这个全局变量(汇率)一次,然后将它保存在某处(在哪里?),这样我就不会看到这些看起来多余(虽然缓存)数据库请求?

回答

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查询和高速缓存命中,因此它肯定存在,但不像每次需要汇率时实际触及数据库那么糟糕。

+0

这是一个很好的答案,谢谢。你认为有一种简单的推广方法,所有的设置都是这样加载的,而不必为每个设置单独的函数? – 2011-02-15 11:14:18

相关问题