Rails迁移。使用change_column将整数值转换为boolean

时间:2017-12-28 17:26:52

标签: ruby-on-rails postgresql database-migration

我正在使用RoR5和PostgreSQL。我有一个列status的表。这是一个类型为整数,并包含三个值0,1,2。这些值代表三种状态allowednot_allowedno_tests

我要改变逻辑。我想将两个状态allowednot_allowed转换为boolean。然后,我将为no_tests创建一个单独的列。

现在我有这样的依据: enum status: %i[allowed not_allowed no_tests]

我应该如何编写迁移,以便在更改的列中将allowed true以及not_allowedno_tests都设为false

2 个答案:

答案 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