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

时间:2009-02-19 17:32:37

标签: ruby-on-rails database architecture

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

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

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

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

所以,一个更简单的问题:你如何处理RoR中的应用程序参数?

5 个答案:

答案 0 :(得分:6)

有许多全局配置插件,其中大部分都是围绕在某个时刻加载YAML文件的想法。查看this pagethis plugin甚至此Railscast

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我倾向于为每个列添加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插件进行管理。

答案 4 :(得分:0)

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

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

  1. 开发/测试/生产环境常见的应用程序广泛配置
  2. 特定于envrionments dev / test / prod
  3. 的配置

    对于第一个场景,“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'
    

    并将环境特定项目放在该文件中,确保它们以大写字母开头。并且对于test / prod(以及其他需要的话)遵循相同的模式。

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