存储应用程序参数的最佳位置在哪里:数据库,文件,代码……?

我正在开发一个Ruby on Rails网站,我有一个“架构”问题:我的应用程序需要一些参数,我想知道在哪里存储它们。

具体而言,我的应用程序会收到一些评估然后发送的请求。 因此,请求模型必须具有与这些处理相关的属性: validation状态发送状态 。 例如, validation状态可以是“ 接受 ”,“ 拒绝 ”或“ 等待 ”。 发送状态可以是“ 发送 ”,“ 等待 ”,“ 发送期间出错 ”或类似的东西。 我必须在某处存储这些状态代码参数,但我不知道什么是最佳解决方案。

我可以为每个模型创建一个模型并将它们存储在数据库中(例如,有一个活动的记录模型ValidationStatus)但是:创建一个数据库/模型来存储这样的数据不是很难吗?

我也可以在代码中使用它们而不“存储”它们,我可以将它们存储在YAML文件中……

那么,一个更简单的问题是:如何处理RoR中的应用程序参数?

有许多全局配置插件,其中大部分都是围绕在某些时候加载YAML文件的想法。 检查此页面 , 此插件甚至此Railscast 。

我把它们放在数据库中。 我有很多这些,而且它们都是非常简单的字符串列表。 这些表都是相同的 – 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 

某个配置文件中必须包含此文件; 除此之外,它非常简单。

我没有使用Ruby,但我会告诉你,我开始(在ASP.NET中)在Web.Config文件中放置了大量设置(类似于YAML)。 然而,随着时间的推移,系统逐渐发展到不同实例需要不同设置的程度。 因此,几乎所有这些都已迁移到数据库。 所以… 如果您要部署多个站点实例,我强烈建议您将设置保存在数据库的表中(我的只有一条记录,包含各种设置的字段)。 如果我开始这样做,我会节省大量时间。

我倾向于为每个string创建一个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插件来管理它。

(从那以后看到上面提到的导轨演员[第85集] – 它看起来比下面的’轨道’更多了)

另一种方法是在Rails中构建现有的配置机制。 让我们假设有两种类型的配置:

  1. 适用于dev / test / prod环境的app广泛配置
  2. 特定于envrionments dev / test / prod的配置

对于第一个场景,“RAILS_ROOT +’/ config / environment.rb’”中的项目有效。 只要看看这些名称是有限的,所以它们是Ruby常量。 对此的变体是对该environment.rb文件中的另一个文件的引用…

 require RAILS_ROOT + '/config/appConfigCommon.rb' 

并将相关的配置项放在该文件中。 这具有能够独立于Rails引用的优点。

对于方案2,可以采用类似的方法。 将项目放在“RAILS_ROOT +’/ config / environment / development.rb’”或类似的东西中

 require RAILS_ROOT + '/config/environments/appConfigDev.rb' 

并将环境特定项目放在该文件中,确保它们以大写字母开头。 并按照相同的模式进行测试/生产(如果需要,可以使用其他模式)。

只需使用常量名称,即可在视图和控制器中直接访问配置项(不确定模型)。