【问题标题】:Rails migration. Cast integer values into boolean with change_column轨道迁移。使用 change_column 将整数值转换为布尔值
【发布时间】:2017-12-28 17:26:52
【问题描述】:

我将 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

【问题讨论】:

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


【解决方案1】:

实际上这是两个独立的操作(更改表结构、转换现有数据),通常只有一个会在迁移中完成。如果我是你,我会首先运行迁移以添加新的状态列,然后在 sql 中进行更新,如果你可以轻松访问 postgres 控制台或在 rails 控制台重新编码新列中的现有数据。重新编码数据后,您可以在另一个迁移中删除旧列。

【讨论】:

    【解决方案2】:

    我认为您将需要在迁移过程中使用 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

    【讨论】:

    • 有趣。不知道在迁移中可以做这样的事情。有这方面的文件吗?谢谢@Manishh
    • @IlliaKuzma 我已经用文档链接更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 2017-05-04
    • 2014-09-03
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多