在Rails中将模型常量作为列表或枚举实现

问题描述 投票:0回答:2

我有一个模型常数,基本上是environments的值,如下:

class Account
  has_many :account_configs
  accepts_nested_attributes_for :account_configs
  ACCOUNT_ENVS = %w[development staging production].freeze
end

class AccountConfig
  validates :account, presence: true
  validates :environment, inclusion: {in: Account::ACCOUNT_ENVS}
end

常数ACCOUNT_ENVS也用在view中。现在,这对于我的情况来说效果很好,但是我应该在这里使用enum吗?如果是,该如何使用?

ruby-on-rails ruby ruby-on-rails-5
2个回答
0
投票

使用enuminteger)性能更高,但这意味着其他人/应用程序查看数据库需要知道如何解释该值。

使用string的性能较差,但这意味着[其他人/应用程序可以立即理解该值的含义。

[多少一个人相对于另一个人的绩效更高?这取决于您的用例。这里没有简单的答案。您可以尝试对其进行基准测试,但是对于大多数应用程序来说,它可能不会有太大的不同。

哪个选项是更好?同样,没有具体的答案。这取决于您的用例。特别是,请参阅上面有关查看同一数据库的其他人员/应用程序的评论。

了解两种方法的优缺点,并为自己选择最好的方法。


0
投票

您可以进行以下迁移,

class ChangeEnvironmentOfAccountConfig < ActiveRecord::Migration
  def up
    change_column :account_configs, :environment, :integer, default: 0
  end
end

默认始终设置为development

在模型中,

class AccountConfig
  enum environment: %w(:development, :staging, :production)
end

config = AccountConfig.create

config.environment
# => "development"

config.production?
# => false

config.production! #updates the object

AccountConfig.development # acts as scope to filter with environment 
© www.soinside.com 2019 - 2024. All rights reserved.