ruby-on-rails - 在 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
但是上面的迁移是抛出错误。请查看终端屏幕截图是否有错误。
解决方案
由于您要通过 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"
推荐阅读
- reactjs - 使用 Amplify 实现的登录表单未应用样式
- r - ggplot boxplot 只显示一个而不是 10 个,如何解决?
- java - Android进度条不显示tje进度
- python - PyQt5 像素级碰撞检测
- node.js - 每个客户单页应用程序的自定义域名
- google-bigquery - DBT 404 未找到:数据集 hello-data-pipeline:staging_benjamin 在 EU 位置未找到
- html - Django:下拉框
- html - 如何使用 CSS 使表单输入垂直而不是水平?
- python - ImportError:没有名为“setuptools.build_meta”的模块
- codeigniter-3 - 获取总插入结果集的第一行/id 和最后一行/id,而不是仅最后一个 id/行。SQL,PHP,Codeigniter