Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 模型赢得';使用Model.update\u属性时不保存更改!在Rails3迁移期间_Ruby On Rails_Ruby_Ruby On Rails 3_Database Migration - Fatal编程技术网

Ruby on rails 模型赢得';使用Model.update\u属性时不保存更改!在Rails3迁移期间

Ruby on rails 模型赢得';使用Model.update\u属性时不保存更改!在Rails3迁移期间,ruby-on-rails,ruby,ruby-on-rails-3,database-migration,Ruby On Rails,Ruby,Ruby On Rails 3,Database Migration,我有以下Rails 3迁移,它向名为games的表中添加了一列game_类型。它应该根据live是否为true来更新game_类型的值,但该值永远不会保存 class AddGameTypeToGames < ActiveRecord::Migration class Game < ActiveRecord::Base end def up say "Adding game_type column to Games table" add_column

我有以下Rails 3迁移,它向名为games的表中添加了一列game_类型。它应该根据live是否为true来更新game_类型的值,但该值永远不会保存

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
class AddGameTypeToGamesfalse,:default=>Demo'
用时间说“将实时值迁移到游戏类型列”吗
受影响的行数=0
游戏。全部。每个人都做游戏|
如果游戏在线
game.update_属性!(:游戏类型=>'Live')
受影响的行数+=1
结束
结束
受影响的行数
结束
结束
结束
我最终通过更改行
game.update\u属性实现了这一点!(:game_type='>'Live')
game.connection.execute(“更新games SET game_type='Live'其中id={game.id}”)


我想知道为什么要更新_属性!不管用吗?我还有其他迁移,在这些迁移中效果很好。包括模型应该可以阻止验证妨碍迁移。在迁移过程中,我尝试在游戏模型上设置attr\u accessible:game\u type,但没有成功。

在游戏模型上运行循环之前,必须添加这一行

Game.reset_column_information
Game.all.each do |game|
  ....
  ....
有时,您需要在迁移中添加一列,并在迁移后立即填充该列。在这种情况下,您需要调用Base#reset_column_information,以确保模型具有添加新列后的最新列数据

在API文档中有一个例子。查找“更改模型表后使用模型”