【问题标题】:Rails: Effects of changing the data type of an existing column with existing dataRails:使用现有数据更改现有列的数据类型的影响
【发布时间】:2015-11-17 16:07:23
【问题描述】:

我可能在错误的地方问这个问题,所以如果我是的话,请放轻松并指出正确的方向。

我无法理解使用 Rails 中的现有数据更改现有表中现有列的数据类型将如何影响我正在开发的任何应用程序。

如果我有一个名为 football 的布尔列。 football 可以是真或假。要么,我有足球,要么没有。我意识到,例如,有时可以租借足球。所以,我想将足球列的数据类型更改为字符串。字符串的值可以是真、假或借出。

为此运行迁移后,我会有多糟糕的时间?我现有的数据会怎样?我需要做些什么来避免弄乱我所有的现有数据?而且,我在正确的地方问这个问题吗?

【问题讨论】:

    标签: ruby-on-rails database type-conversion


    【解决方案1】:

    如果您在rails 中将列类型从布尔型更改为字符串,那么您不必担心,因为现有数据会自动更改为字符串。就像如果你有布尔 true 这将自动转换为字符串“true”。

    仅供参考,我在我的系统上检查了这个;)

    【讨论】:

    • 那么,true 将变为“true”,false 将变为“false”?
    • 如果您了解您的实时数据,请在 Rails 中创建小型应用程序并测试一些虚拟数据,然后再对实时数据运行迁移。 ;)
    【解决方案2】:

    如果我是你,我会创建一个新列,然后更新旧列中的所有内容,然后删除旧列,然后重命名新列。此外,我也不会将布尔值保存为“true”或“false”(如果您只是更改类型,Rails 应该默认为您提供)...如果我是您,我会为此列创建一个 enum .

    首先你的迁移:

    class ChangeFootball < ActiveRecord::Migration
      def change
    
        # Add the new column. Use an integer type, so you can set up an Enum in your model
        add_column :examples, :football_new, :integer, default: 0
    
        # Set up the new column values for all your existing records:
        Example.where(football: true).update_all football_new: 0
        Example.where(football: false).update_all football_new: 1
    
        # Now remove the old column:
        remove_column :examples, :football
    
        # Finally, rename the new column to the same as the old one
        rename_column :examples, :football_new, :football
    
        # Oh, and add an index:
        add_index :examples, :football
      end
    end
    

    现在在你的模型中设置枚举:

    enum football: { own: 0, lost: 1, misplaced: 2, loaned: 3 } 
    

    【讨论】:

    • 谢谢,我会读到这个,但你从我丢失/放错位置/借出的评论中采取了太多步骤。我正在编辑问题。
    • 现在您已经编辑了您的问题,我认为@QuibaishBhatti 的答案是适合您的。但是,我仍然认为您应该考虑为此使用带有枚举的整数列,而不是纯字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2021-09-10
    • 2016-10-15
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多