【问题标题】:Rails: storing static lookup types/constants outside databaseRails:在数据库外部存储静态查找类型/常量
【发布时间】:2016-10-28 14:46:11
【问题描述】:

我有用于填充表单字段以及验证属性的静态查找。

我没有将它们存储在数据库中,因为它们是静态的并且不会更改,并且核心应用程序逻辑基于这些值(不希望数据库值更改破坏应用程序)。

# 15+ different categories...
APPLICANT_TYPES = ["primary", "coborrower"].freeze

# forms...
<%= f.select :applicant_type, APPLICANT_TYPES %>

# models...
class Applicant < ApplicationRecord
  validates :applicant_type, inclusion: { in: APPLICANT_TYPES }
end

我有几个可行的选项,但不确定哪一个是最传统的或可能会导致问题。像这样的静态常量的 Rails 约定是什么?

  1. config/initializers/constants.rb
  2. ApplicationRecord 所有模型都继承自
  3. config/constants.yml 对我来说似乎并不受欢迎,因为将 YAML 加载到 Ruby 中需要额外的步骤,所以为什么不直接使用上面的 constants.rb 呢?

我有点困惑,因为它们中的任何一个都会起作用,但我确信有一些我没有考虑到的意外副作用。

【问题讨论】:

    标签: ruby-on-rails configuration constants


    【解决方案1】:

    标准做法是在与它们最相关的类(或模块)中定义常量。在您的示例中,您将在 Applicant 中定义它们:

    class Applicant < ApplicationRecord
      APPLICANT_TYPES = ["primary", "coborrower"].freeze
    end
    

    然后当你使用它们时,通过那个类(或模块)引用它们:

    <%= f.select :applicant_type, Applicant::APPLICANT_TYPES %>
    

    这是一个非常普通的答案,但到目前为止它对我很有帮助!

    还请查看ActiveRecord::Enum,以防万一这是对您有帮助的模式。

    【讨论】:

    • 我喜欢传统的“普通香草”,所以这对我有用!适用于 2 种不同模型的类型呢?例如,我有一个 Contact 模型和一个 Partner 模型,它们都有一个从 CITIZENSHIPS 常量数组中提取的 citizenship_type 属性。我正在考虑将“共享”常量放在父 ApplicationRecord
    • 对于共享常量,我建议制作一个仅充当持有者的模块(如Citizen::CITIZENSHIPS)。没有什么需要包含该模块,它只是一个合乎逻辑的好名字。 ApplicationRecord 适用于所有模型需要的数据,而模块适用于只有某些模型需要的任何数据!
    猜你喜欢
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2013-06-21
    • 2016-03-31
    • 2014-06-13
    • 1970-01-01
    相关资源
    最近更新 更多