【问题标题】:Add enum value to a ruby on rails model and make it default for all new model instances将枚举值添加到 ruby​​ on rails 模型,并将其设为所有新模型实例的默认值
【发布时间】:2020-08-20 14:04:36
【问题描述】:

我在模型中定义了一个这样的枚举

enum status: { started: "started", passed: "passed", failed: "failed" }

我想为它添加价值draft: "draft"

但据我了解,我必须以某种方式运行迁移才能将其添加到数据库中。我该怎么做? 可能是个愚蠢的问题,请多多包涵,谢谢。

:编辑 感谢反馈

我还需要将新添加的枚举值设为所有新模型的默认值。这可能需要迁移,但我将如何生成它?

【问题讨论】:

  • 迁移会做什么?我认为您可以为这个枚举添加一个新值并开始使用它。
  • 如果是这种情况,我会在问题中补充一点,感谢您的输入

标签: ruby-on-rails ruby enums model


【解决方案1】:

您可以将枚举值添加到列表中。

enum status: { started: "started", passed: "passed", failed: "failed", draft: "draft" }

如果枚举是一个数组,你必须确保只将新值添加到数组的末尾,否则记录会出现错误的状态。

至于将其设为新记录的默认值,我会在模型中执行此操作,而不是在数据库中...

class MyModel < ApplicationRecord
  before_save :initialize_status

  private

  def initialize_status
    self.status ||= 'draft' if new_record?
  end
end

【讨论】:

  • 数组声明确实如此:enum status: [ :active, :archived ]。那里有一个隐式映射(符号到整数(数组索引))。但是在这里,映射是明确的。您确定将新的 KV 对放在列表前面会使记录的状态错误吗?
  • @SergioTulentsev 是的,你是对的,哈希对这个问题免疫,我的错。答案已更正。
  • 这样更好 ? 真正的问题是关于迁移,不过(将新值设为新行的默认值)
  • 另一个好点@SergioTulentsev,修改后的答案。
猜你喜欢
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多