【发布时间】:2012-02-20 05:13:51
【问题描述】:
我正在创建一个名为 Configuration 的模型,我有以下代码,我想通过使用元编程使其更具动态性。
在配置模型的数据库表中,我有以下数据。
---------------------------------------------------------
variable_name as string | value in text
|
company_name | MyCompany
welcome_text | Welcome to MyCompany's App!
email_order_text | You've just created an account with MyCompany.
year_since | 2012
----------------------------------------------------------
class Configuration < ActiveRecord::Base
#nothing here yet
end
----------------------------------------------------------
目前,访问 company_name 的唯一方法是在 rails 控制台中执行以下操作:
configuration_company_name = Configuration.find_by_variable_name("company_name")
configuration_company_name.company_name
> "MyCompany"
我认为这是一种不可接受的做事方式。首先,每当有人检查公司名称时,它都会访问数据库。我想如果我可以在应用程序启动时加载它并且因为它在内存中而不必再次访问它,那么它会更好。我怎样才能做一些更动态的事情,以便我可以像这样访问值“MyCompany”。
Configuration.company_name
> "MyCompany"
这样做的原因是允许快速自定义应用程序。
【问题讨论】:
-
你确定这真的是个问题吗? Rails 非常擅长缓存对数据库的请求,所以我不希望每次有人想要 company_name 时都会查询数据库。正如著名的 Donald Knuth 名言:“......过早的优化是万恶之源”。
-
我认为这是问题的一部分。当我检查 production.log 时,它不断向 MySQL 发送请求,这并不理想。主要问题是将变量作为类方法访问,而不是必须获取 find_by_variable 或 where("variable =?", variable) 这很难看。
标签: ruby-on-rails ruby model metaprogramming instance-variables