为 postgres rails 中的 Enum 类型添加额外的值

Sou*_*nka 4 postgresql enums ruby-on-rails

我正在运行下面给出的迁移来为我的blood枚举添加一个额外的值。

class AddTypesToBlood < ActiveRecord::Migration[5.2]
  def up
    execute <<-SQL
      ALTER TYPE blood ADD ATTRIBUTE 'NA';
    SQL
  end

  def down
    execute <<-SQL
      ALTER TYPE blood DROP ATTRIBUTE 'NA';
    SQL
  end
end
Run Code Online (Sandbox Code Playgroud)

但是上面的迁移是抛出错误。Pease 查看终端屏幕截图是否有错误。

在此处输入图片说明

bwa*_*shy 6

由于您要通过 SQL 添加新的枚举值,我猜您也通过 SQL 将列定义为枚举。所以 使用 Postgres 的文档:

ALTER TYPE 名称 ADD VALUE new_enum_value [ { BEFORE | 之后} existing_enum_value ]

试一试:

def up
  execute <<-SQL
    ALTER TYPE blood ADD VALUE 'NA';
  SQL
end

def down
  execute <<-SQL
    ALTER TYPE blood DROP VALUE 'NA';
  SQL
end
Run Code Online (Sandbox Code Playgroud)

在 Rails 中处理枚举的另一种方法是在模型中定义枚举。所以你可以做的是让你的模型有一个属性(称为blood)是 type integer。然后在模型中,您可以执行以下操作:

class Model < ApplicationRecord
  enum blood: [
    :A,
    :B,
    :AB,
    :O,
    :NA
  ]
end
Run Code Online (Sandbox Code Playgroud)

这样,当您想要修改枚举的值时,您不必创建另一个迁移。这样做的另一个好处是您可以使用字符串(或符号)作为枚举的值。IE:

# Both work
model.update_attributes(blood: 'O')
model.update_attributes(blood: :O)
Run Code Online (Sandbox Code Playgroud)

当您访问该blood属性时,您仍然会得到一个字符串:

puts model.blood # => "O"
Run Code Online (Sandbox Code Playgroud)

  • 当前没有“DROP VALUE”这样的东西,并且在 postgres 9.1 版本(已引用)中也没有。因此,如果您尝试在迁移过程中运行类似的操作,您将收到语法错误。 (2认同)