Rails:使用现有数据更改现有列的数据类型的效果

时间:2015-11-17 16:07:24

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

如果我是你,我会通过创建一个新列,然后从旧列更新所有内容,然后删除旧列,并重命名新列来完成此操作。另外我也不会将布尔值保存为“true”或“false”(如果你只是改变类型,Rails应该默认给你)...如果我是你,我会创建一个enum for这一栏。

首先你的迁移:

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 }