web-dev-qa-db-ja.com

Model.reset_column_informationがRails移行で列を再ロードしない

私は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が含まれており、どちらも正常に動作します。

私はこれについて頭を悩ませています。

48
Iain

これはスキーマキャッシングに関連するある種のバグに違いないと思います...これはうまくいくかもしれません:

User.connection.schema_cache.clear!
User.reset_column_information

(Rails 3.2.2)

83
Seamus Abshere

これは、Rails 6(6.0.0beta3でテスト済み))では必要ありません。

update!(new_column: ...)update_all(new_column: ...)の両方を試しました

0
localhostdotdev