存储应用程序参数的最佳位置在哪里:数据库、文件、代码......?
Posted
技术标签:
【中文标题】存储应用程序参数的最佳位置在哪里:数据库、文件、代码......?【英文标题】:Where is the best place to store application parameters : database, file, code...? 【发布时间】:2010-10-08 15:45:06 【问题描述】:我正在开发一个 Ruby on Rails 网站,我有一个“架构”问题:我的应用程序需要一些参数,我想知道在哪里存储它们。
具体来说,我的应用程序会收到一些请求,这些请求会被评估然后发送。因此,请求模型必须具有与这些处理相关的属性:验证状态和发送状态。例如,验证状态可以是“accepted”、“rejected”或“waiting”。 发送状态可以是“发送”、“等待”、“发送期间出错”或类似的东西。我必须将这些状态代码参数存储在某个地方,但我不知道什么是最好的解决方案。
我可以为每个模型创建一个模型并将它们存储在数据库中(例如,拥有一个活动记录模型 ValidationStatus)但是:创建一个用于存储数据的数据库/模型会不会有点过分?
我也可以只在代码中使用它们而不“存储”它们,我可以将它们存储在 YAML 文件中......
那么,一个更简单的问题:您如何处理 RoR 中的应用程序参数?
【问题讨论】:
【参考方案1】:(已经看过上面提到的 Rails 演员 [第 85 集] - 它看起来比下面的“rails way”更多)
另一种方法是在 Rails 中现有的配置机制上进行构建。 假设有两种类型的配置:
-
开发/测试/生产环境通用的应用范围配置
特定于环境 dev/test/prod 的配置
对于第一个场景,“RAILS_ROOT + '/config/environment.rb'”中的项目有效。只需看到名称是大写的,因此它们是 Ruby 常量。对此的一种变体是引用了该 environment.rb 文件中的另一个文件...
require RAILS_ROOT + '/config/appConfigCommon.rb'
并将相关的配置项放在该文件中。这样做的好处是可以独立于 Rails 进行引用。
对于场景 2,可以采取类似的方法。将要开发的项目放在“RAILS_ROOT + '/config/environments/development.rb'”或类似的地方
require RAILS_ROOT + '/config/environments/appConfigDev.rb'
并将环境特定的项目放在所需的文件中,确保它们以大写字母开头。并按照相同的模式进行测试/生产(如果需要,还可以使用其他模式)。
只需使用常量名称,即可在视图和控制器中直接访问配置项(不确定模型)。
【讨论】:
【参考方案2】:我倾向于为每个人创建一个string
列,并使用validates_inclusion_of
来设置他们可以接受的内容。
class Request < ActiveRecord::Base
validates_inclusion_of :validation_status, :in => ['accepted','rejected','waiting']
validates_inclusion_of :sending_status, :in => ['sent','waiting','...']
end
如果您需要在状态更改时发生一些事情(即发送电子邮件),请考虑使用Acts As State Machine 插件来管理它。
【讨论】:
【参考方案3】:我没有使用 Ruby,但我会告诉你,我开始(在 ASP.NET 中)在 Web.Config 文件中放置大量设置(类似于 YAML)。然而,随着时间的推移,系统发展到不同实例需要不同设置的地步。因此,几乎所有这些都迁移到了数据库中。所以...如果您将部署站点的多个实例,我强烈建议您将设置保存在数据库表中(我的只有一条记录,其中包含用于各种设置的字段)。如果我一开始就这样做,我会节省大量时间。
【讨论】:
【参考方案4】:我将它们放入数据库中。我有很多这些,它们都是非常简单的字符串列表。这些表都是相同的 - id、name、description。
我为它们生成模型,而不是为每个模型创建一个实际的模型文件。在 app/models 我有一个名为 active_record_enums.rb 的文件,在你的情况下看起来像这样:
ACTIVE_RECORD_ENUMS = %w
ValidationStatus
SendingStatus
ACTIVE_RECORD_ENUMS.each do |classname|
eval "class #classname < ActiveRecord::Base; end"
classname.constantsize.class_eval do
# Add useful methods - id_for(name) and value_for(id) are handy
end
end
这个文件必须在某个配置文件中;除此之外,它非常简单。
【讨论】:
那么,在您的数据库中,每个参数都有一个表?这意味着您有许多小桌子?另一种解决方案可能是只有一个带有字段 id、类型、名称和描述的 ActiveRecord 模型“参数”。你怎么看? 你可以通过 STI 做到这一点,是的。您只需要更改生成的类代码以包含它。就我而言,大多数表都相当大,因此值得将它们分开。【参考方案5】:有很多全局配置插件,其中大部分都围绕在某个时候加载 YAML 文件的想法。检查this page、this plugin 甚至这个Railscast。
【讨论】:
以上是关于存储应用程序参数的最佳位置在哪里:数据库、文件、代码......?的主要内容,如果未能解决你的问题,请参考以下文章