2

我在我的应用程序中设置了属性的整数值的所有模型,但现在我已经添加到数据库中,我意识到它们需要是小数(最多允许 2 个小数位)。

有很多属性需要更改(即每个模型大约 20 个)。

我的搜索告诉我每个模型都需要数据库迁移,例如

rails generate migration change_data_type_for_tpn

然后编辑迁移说

class ChangeDataTypeForTPN < ActiveRecord::Migration
  def self.up
    change_table :tpn do |t|
      t.change :pot, :decimal, :precision => 2, :scale => 1
    end
  end

  def self.down
    change_table :tpn do |t|
      t.change :pot, :integer
    end
  end
end

我的问题是:

  1. 这看起来对吗?
  2. 为什么它需要 self.up 和 self.down 即这实际上是什么意思?
  3. 如果我想同时进行多个属性类型更改,我可以在第一个下面添加另一个 t.change 行吗?

谢谢

4

1 回答 1

4
  1. 看起来不错,我会尽快发布我会发布的内容。

  2. self.up 和 down 是您的迁移与数据库交互的方式,当您运行 rake db:migrate 时,每个迁移都会在您的数据库中运行 self.up,当您使用像 rake db:rollback 这样的回滚方法时,它将使用 self .down 方法

  3. 是的,您可以更新多行。

在这里,我发布了一个我会做什么的例子:https ://gist.github.com/kazpsp/6226710

class Fixtables < ActiveRecord::Migration
  def self.up
   change_column :table_name, :column_name, :newtype
   change_column :table_name, :column_name2, :newtype
   change_column :table_name2, :column_name, :newtype
  end
  def self.down
   change_column :table_name, :column_name, :oldtype
   change_column :table_name, :column_name2, :oldtype
   change_column :table_name2, :column_name, :oldtype
  end
end

现在更深入地考虑这种类型更改可能使您的数据库不可逆的问题,考虑这种情况,您有一个曾经将整数作为列类型的表,当您填充该数据库时,您将其更改为字符串,您将在该列中有许多数据库行的字符串,如果您尝试回滚您的数据库,它将显示错误,因为现在在行上的字符串值在您回滚时可能会变成整数,因此在执行此类迁移时要小心因为它们可能是不可逆转的,除非您丢失所有数据。

于 2013-08-13T23:21:41.960 回答