我正在使用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
?
实际上,这是两个单独的操作(更改表结构,转换现有数据),通常只在迁移中完成一个操作。如果我是你,我将首先运行迁移以添加新的状态列,然后在sql中进行更新,如果您可以轻松访问postgres控制台或在rails控制台上重新编码新列中的现有数据。在重新编码数据后,您可以在另一次迁移中删除旧列。
我认为你需要在迁移中使用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中使用case语句它会有所帮助。你可以将你的查询放在迁移中,类似于here。
你还可以做一件事: 1.进行迁移以添加新列。 2.使rake任务填充数据。 3.再进行一次迁移以删除旧列并重命名新添加的列。
更新:为了更好地了解迁移,请阅读this article。