これを「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 番目のループはまだ何も出力しません。何か案が?
これを「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 番目のループはまだ何も出力しません。何か案が?
検証エラーのため、ユーザーが保存されていない可能性があります。
検証エラーを処理したくない場合は、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: トランザクションを使用することをお勧めします。