我有一个模型常数,基本上是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
吗?如果是,该如何使用?
使用enum
(integer
)性能更高,但这意味着其他人/应用程序查看数据库需要知道如何解释该值。
使用string
的性能较差,但这意味着[其他人/应用程序可以立即理解该值的含义。
[多少一个人相对于另一个人的绩效更高?这取决于您的用例。这里没有简单的答案。您可以尝试对其进行基准测试,但是对于大多数应用程序来说,它可能不会有太大的不同。
哪个选项是更好?同样,没有具体的答案。这取决于您的用例。特别是,请参阅上面有关查看同一数据库的其他人员/应用程序的评论。
了解两种方法的优缺点,并为自己选择最好的方法。
您可以进行以下迁移,
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