存储应用程序参数的最佳位置在哪里:数据库,文件,代码……?
我正在开发一个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中构建现有的配置机制。 让我们假设有两种类型的配置:
- 适用于dev / test / prod环境的app广泛配置
- 特定于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'
并将环境特定项目放在该文件中,确保它们以大写字母开头。 并按照相同的模式进行测试/生产(如果需要,可以使用其他模式)。
只需使用常量名称,即可在视图和控制器中直接访问配置项(不确定模型)。