0

これを「def up)」内の移行ファイルに入れました

User.find(:all).each do |user|
    user.login = user.name
    user.save
end 
User.find(:all).each do |user|
    puts user.login
end 

user.name は間違いなく空ではありません。このコードでは、2 番目のループはまだ何も出力しません。何か案が?

4

1 に答える 1

0

検証エラーのため、ユーザーが保存されていない可能性があります。

検証エラーを処理したくない場合は、bang バージョンを使用して保存する必要があります ( user.save!)。つまり、エラーが発生します。

検証を防ぐために、移行内でモデルを定義できます。

class CopyUserNameToLogin < ActiveRecord::Migration

  class User < ActiveRecord::Base
  end

  def up
    User.find_each do |user|
      user.login = user.name
      user.save!
    end
  end

  def down
    raise ActiveRecord::IrreversibleMigration
  end

end

ヒント:find_eachユーザーをバッチで取得するために使用します。これにより、メモリ使用量が削減されます。

ヒント 2: トランザクションを使用することをお勧めします。

于 2012-04-30T22:45:13.977 に答える