Rails 迁移:更改列类型并更新现有数据
Rails migration : Change column type and update existing data
在我的 Rails 项目中,我有一个模型对象,它有一个名为 'permanent' 的 'Boolean' 类型的现有列。我需要将此列更改为可能值为 1、2、3 的整数。我有什么方法可以更新数据库中的现有数据(通过 rails 迁移),以便所有带有 [= 的行13=] 为 false 更改为 1,所有 'permanent' 为 true 的行都更改为 2。
我正在使用 Postgres。不确定此解决方案是否适用于其他数据库。
people table 用作示例 - 不要忘记将 table 名称更改为您自己的名称。
def up
change_column :people, :permanent, 'integer USING CAST(permanent AS integer)'
Person.connection.execute("UPDATE people SET permanent = CASE permanent WHEN 0 THEN 1 WHEN 1 THEN 2 END")
end
def down
Person.connection.execute("UPDATE people SET permanent = CASE permanent WHEN 1 THEN 0 WHEN 2 THEN 1 END")
change_column :people, :permanent, 'boolean USING CAST(permanent AS boolean)'
end
在我的 Rails 项目中,我有一个模型对象,它有一个名为 'permanent' 的 'Boolean' 类型的现有列。我需要将此列更改为可能值为 1、2、3 的整数。我有什么方法可以更新数据库中的现有数据(通过 rails 迁移),以便所有带有 [= 的行13=] 为 false 更改为 1,所有 'permanent' 为 true 的行都更改为 2。
我正在使用 Postgres。不确定此解决方案是否适用于其他数据库。 people table 用作示例 - 不要忘记将 table 名称更改为您自己的名称。
def up
change_column :people, :permanent, 'integer USING CAST(permanent AS integer)'
Person.connection.execute("UPDATE people SET permanent = CASE permanent WHEN 0 THEN 1 WHEN 1 THEN 2 END")
end
def down
Person.connection.execute("UPDATE people SET permanent = CASE permanent WHEN 1 THEN 0 WHEN 2 THEN 1 END")
change_column :people, :permanent, 'boolean USING CAST(permanent AS boolean)'
end