【发布时间】:2019-12-03 05:42:53
【问题描述】:
我在对数据建模时犯了一个错误,并创建了一个包含 4 个布尔值的模型,一次只有一个处于活动状态。我想创建一个 Postgres 枚举类型的列,然后根据之前设置的布尔标志设置值。
我知道我想从这样的事情开始:
class ChangePositionTypeToBeEnumInPosition < ActiveRecord::Migration[6.0]
def change
reversible do |change|
change.up do
execute <<-SQL
CREATE TYPE position_type AS ENUM ('chair', 'jboard', 'eboard', 'aboard');
SQL
# TODO: Execute code to create a new column and set values based off of existing values in the same row
# TODO: Drop the 4 boolean columns
end
change.down do
# TODO: Create the 4 boolean columns
# TODO: Set one to true depending on the enum state
execute <<-SQL
DROP TYPE position_type;
SQL
end
end
end
end
我的问题是:我可以在我的 TODO cmets 所在的地方做什么?之前我在我的用户模型中编写了一个从整数到 Postgres 枚举的迁移,我的 change_column 代码如下所示:
change_column :users, :member_type, <<-SQL.strip
member_status USING
CASE member_type
WHEN '0' THEN 'inactive'::member_status
WHEN '1' THEN 'active'::member_status
WHEN '2' THEN 'suspended'::member_status
END
SQL
我想我正在尝试编写的代码是此代码的一些变体,带有一连串的 if 语句。任何意见将不胜感激。
【问题讨论】:
-
您想使用 postgres 枚举还是 rails 枚举?我们通常使用 rails 枚举而不是正确的 postgres 枚举类型。
标签: sql ruby-on-rails postgresql rails-migrations ruby-on-rails-6