2

我有以下 Rails 3 迁移,它将列 game_type 添加到名为 games 的表中。它应该根据 live 是否为真来更新 game_type 的值,但这个值永远不会被保存。

class AddGameTypeToGames < ActiveRecord::Migration

  class Game < ActiveRecord::Base
  end

  def up
    say "Adding game_type column to Games table"
    add_column :games, :game_type, :string, :null => false, :default => 'Demo'

    say_with_time "Migrating live value into game_type column" do
      rows_affected = 0
      Game.all.each do |game|
        if game.live
          game.update_attributes!(:game_type => 'Live')
          rows_affected += 1
        end
      end
      rows_affected
    end
  end
end

我最终通过将线路更改game.update_attributes!(:game_type => 'Live')Game.connection.execute("UPDATE games SET game_type='Live' where id = #{game.id}").

我想知道为什么 update_attributes!行不通?我还有其他可以正常工作的迁移。包含模型应该阻止验证妨碍迁移。我尝试attr_accessible :game_type在迁移中设置游戏模型,但这不起作用。

4

1 回答 1

4

您必须在游戏模型上运行循环之前添加此行

Game.reset_column_information
Game.all.each do |game|
  ....
  ....

有时您会想要在迁移中添加一列并在之后立即填充它。在这种情况下,您需要调用 Base#reset_column_information 以确保模型具有添加新列后的最新列数据。

在ActiveRecord::Migration的 API 文档中有一个示例。查找“更改表格后使用模型”

于 2012-07-27T13:35:50.770 回答