2

次のRails3移行があり、gamesというテーブルにgame_type列が追加されています。liveがtrueであるかどうかに応じて、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 モデルでループを実行する前に、この行を追加する必要があります

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

移行に列を追加し、その直後にデータを入力したい場合があります。その場合、新しい列が追加された後の最新の列データがモデルに含まれていることを確認するために、Base#reset_column_information を呼び出す必要があります。

ActiveRecord::Migrationの API ドキュメントにこの例があります。「テーブルを変更した後のモデルの使用」を探します

于 2012-07-27T13:35:50.770 に答える