我正在使用RoR5和PostgreSQL。我有一个列status
的表。这是一个类型为整数,并包含三个值0,1,2。这些值代表三种状态allowed
,not_allowed
和no_tests
。
我要改变逻辑。我想将两个状态allowed
和not_allowed
转换为boolean
。然后,我将为no_tests
创建一个单独的列。
现在我有这样的依据:
enum status: %i[allowed not_allowed no_tests]
。
我应该如何编写迁移,以便在更改的列中将allowed
true
以及not_allowed
和no_tests
都设为false
?
答案 0 :(得分:1)
实际上这是两个单独的操作(更改表结构,转换现有数据),通常只会在迁移中完成一个操作。如果我是你,我将首先运行迁移以添加新状态列,然后在sql中进行更新(如果您可以轻松访问postgres控制台)或在rails控制台上重新编码新列中的现有数据。在重新编码数据后,您可以在另一次迁移中删除旧列。
答案 1 :(得分:0)
我认为在迁移过程中你需要up
方法中的一些东西。
def up
add_column :table_name, :status2, :boolean
Loop on each element of model check for status and update status2
remove_column :table_name, :status
rename_column :table_name, :status2, :status
end
您还可以在更新here中使用案例陈述。这会有所帮助。您可以将查询置于迁移状态,也可以与here类似。
你还可以再做一件事:
1.进行迁移以添加新列
2.制作rake任务来填充数据
3.再进行一次迁移以删除旧列并重命名新添加的列。
更新:为了更好地了解迁移,请阅读this article。