2015-11-17 52 views
1

我可能会在错误的地方问这个问题,所以如果我愿意,可以轻松指出我正确的方向。Rails:使用现有数据更改现有列的数据类型的影响

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

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

运行此迁移后,我将有多少时间?我现有的数据会发生什么?我需要做些什么来减轻我所有现有数据的负担?而且,我是否在正确的地方问这个问题?

回答

2

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

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

+0

所以,TRUE;将变更为 “真” 和'FALSE'为 “假”? –

+0

是的...... –

+0

如果您意识到您的实时数据,那么在运行实时数据迁移之前,先在rails中创建小应用程序并测试一些虚拟数据。 ;) –

0

如果我是你,我会通过创建一个新列,然后从旧列更新所有内容,然后删除旧的列,重命名做到这一点新的一个。我也不会保存布尔值为“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 } 
+0

谢谢,我会读到这个,但你从我的迷路/错放/借阅的评论。我在编辑这个问题。 –

+0

现在你已经编辑了你的问题,我认为@ QuibaishBhatti的答案是适合你的。不过,我仍然认为你应该考虑使用带有枚举的整数列,而不是纯字符串。 – rlarcombe

相关问题