2012-07-27 50 views
2

我有以下Rails 3遷移,它將一個列game_type添加到名爲games的表中。它應該根據live是否爲true來更新game_type的值,但是這個值永遠不會被保存。使用Model.update_attributes時,模型不會保存更改! Rails 3遷移期間

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,但這不起作用。

回答

2

你有博弈模型

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

運行循環之前加入這行有時你會想在遷移添加一列後立即填充它。在這種情況下,您需要調用Base#reset_column_information以確保該模型具有添加新列後的最新列數據。

ActiveRecord::Migration的API文檔中有這樣的例子。尋找「在更換桌子後使用模型」

+1

謝謝你,對我來說是一個愚蠢的疏忽。 – 2012-07-27 14:49:06