首页 > 解决方案 > 在 postgres rails 中为 Enum 类型添加额外的值

问题描述

我正在运行下面给出的迁移以向我的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

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

在此处输入图像描述

标签: ruby-on-railspostgresqlenums

解决方案


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

ALTER TYPE 名称 ADD VALUE new_enum_value [ { BEFORE | 之后}现有枚举值]

试一试:

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

def down
  execute <<-SQL
    ALTER TYPE blood DROP VALUE 'NA';
  SQL
end

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

class Model < ApplicationRecord
  enum blood: [
    :A,
    :B,
    :AB,
    :O,
    :NA
  ]
end

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

# Both work
model.update_attributes(blood: 'O')
model.update_attributes(blood: :O)

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

puts model.blood # => "O"

推荐阅读