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

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。

【讨论】:

以上是关于存储应用程序参数的最佳位置在哪里:数据库、文件、代码......?的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 中存储布局逻辑的最佳位置在哪里?

带有 Repository/Firestore 的 MVVM - 存储来自单个集合的不同查询数组的最佳位置在哪里?

在 Angular 中捕获路由参数的最佳位置在哪里

我可以在哪里存储颤振应用程序的常量?

在钥匙串中存储用于加密密码的密钥的最佳位置在哪里

存储JWT令牌的位置?