如何使用Rails在数据库中存储不同的站点参数?
有很多方法可以在数据库中存储网站首选项。但是如果我需要管理数据类型呢。所以一些首选项将是布尔值,其他字符串,其他整数。如何使用Rails在数据库中存储不同的站点参数?
我该如何组织这样的商店?
我与偏好相当慵懒并存储数据的序列化JSON或YAML哈希值。工作得很好,通常也保留数据类型。
我用单行表单,每列表示一个首选项。这使得可能有不同的数据类型。
为了能够获取的偏爱,我推翻method_missing
能够直接从类名检索喜好值,而不需要一个实例,像这样:
class Setting < ActiveRecord::Base
@@instance = self.first
def self.instance
@@instance
end
def self.method_missing(method, *args)
option = method.to_s
if option.include? '='
var_name = option.gsub('=', '')
value = args.first
@@instance[var_name] = value
else
@@instance[option]
end
end
end
因此,以检索设置,你可以使用:
a_setting = Setting.column_name
这没什么,但是如果我想要设置具有名为'data_type'的字段呢?所以设置可以是例如整数,浮点数,布尔值。 – 2010-01-29 08:02:07
@Igor:那没用。通过使用基于列的存储,您可以让数据库定义数据类型,并且不需要为其分配单独的列。您正在考虑每个设置有一行,并且数据类型只有一列。我的例子是单行,每列可以是任何你想要的数据类型。 – JRL 2010-01-29 08:19:51
是的,也许你是对的:) – 2010-01-29 09:45:26
我写了的宝石,正是这一点,最近更新它为Rails 3:
对于Rails 3的:
http://github.com/paulca/configurable_engine
对于Rails的2.3.x版本
http://github.com/paulca/behavior
享受!
如何使用无模式数据库呢? 它会表现得更好,并且更容易用JSON哈希查询。 – CodeJoust 2010-01-29 06:11:05
你可以,但是你需要为所有的事情抛弃你的RDBMS,或者一起运行这两者来增加你的成本。将数据库中的字符串拉到反序列化的性能非常好,特别是在使用JSON和JSON gem时。使用像MongoDB这样的数据库,你仍然会有反序列化开销。 – 2010-01-29 23:31:43