私はRails 3.2を使用しており、コードを含む移行があります:
add_column :users, :gift_aid, :integer, :default => 2
# reset columns
User.reset_column_information
... code here to load legacy data from sqlite3 database ...
# now create a user with the loaded column data
user = User.create( ...other cols...,
:gift_aid => migrated_gift_aid_column_data,
...other cols... )
移行を実行するとunknown attribute: gift_aid
が表示されます。 User.column_names
は、reset_column_information
の呼び出しの前後で同じリストを表示します。
奇妙なことに、手動でmysqlの列を削除して移行を再実行すると、期待どおりに機能します。空のデータベースを使用して最初の移行から再び開始すると、データベースが機能しないため、単一の移行ではなくすべての移行を実行する必要があります。
ユーザーモデルで以前にいくつかの移行を行っていますが、どちらにもreset_column_information
が含まれており、どちらも正常に動作します。
私はこれについて頭を悩ませています。
これはスキーマキャッシングに関連するある種のバグに違いないと思います...これはうまくいくかもしれません:
User.connection.schema_cache.clear!
User.reset_column_information
(Rails 3.2.2)
これは、Rails 6(6.0.0beta3でテスト済み))では必要ありません。
update!(new_column: ...)
とupdate_all(new_column: ...)
の両方を試しました