Techioz Blog

デプロイ後に ActiveModel::MissingAttributeError が発生し、しばらくすると消えます

概要

Rails 3.0.9 アプリを持っていますが、これをデプロイすると、500 秒を引き起こす大量の ActiveModel::MissingAttributeErrors が発生します。エラーはかなりランダムに発生し、ページが読み込まれる場合もあれば、読み込まれない場合もありますが、属性はすべてデータベース内の既存の属性であるため、見つかるはずです。

奇妙なのは、しばらくするとエラーが消えることです。突然、彼らは問題を引き起こさなくなりました。

これに対する解決策を探しましたが、このエラーは主に誰かがModel.all(:select => ‘column_x,column_y’)を実行してcolumn_zを呼び出している場合、またはcache_moneyを使用している場合に発生します。私はそのどちらもやっていません。

誰か助けてくれませんか?

解決策

おそらく、すべての列を返さない (つまり、:select を使用する) クエリと、cache_money があるクエリがあると思われます。または、他の ActiveRecord プラグインは、新しい ActiveRecord オブジェクトが作成されるたびに (つまり、データベースからフェッチされたときに) 実行される after_initialize コールバックを使用します。

その初期化コールバックでは、:select に含まれていない属性にアクセスまたは使用しようとします。これにより、その属性に対して nil が返されることが期待されますが、代わりに ActiveRecord::MissingAttributeError がスローされます。

記事で提案されているように ActiveRecord::MissingAttributeError をレスキューするか、属性にアクセスしたり変更したりする前に has_attribute?(:attribute_name) を使用するようにプラグインにパッチを適用することができます。