今日、Ruby-on-Rails アプリケーションでバグが発生しました。どういうわけか、Device モデルを介して awsvpc 関連付けにアクセスするたびに、Device モデルの awsaccount_id フィールドが「変更対象としてマーク」されます。
この問題をデバッグするために、いくつかのログ エントリといくつかの余分なコード行 (以下を参照) を追加して、デバイス モデル インスタンスがどのように変更対象としてマークされているかを診断しました。
「dev.changes」メソッドが、ロギング「changes12」と「changes2」の間の保留中の変更を返すことに気付くかもしれません。これらのログ エントリ間で発生する唯一のコードは、dev.awsvpc.id との関連付けにアクセスすることです。
この ruby のコードは、どのような状況で次のようになります。
Rails.logger.info "Update_Device changes0: #{dev.changes}"
sample_vpc = dev.awsvpc_id
Rails.logger.info "Update_Device changes1: #{dev.changes}"
sample_vpc = Awsvpc.find(dev.awsvpc_id)
Rails.logger.info "Update_Device changes12: #{dev.changes}"
sample_vpc = dev.awsvpc.id
Rails.logger.info "Update_Device changes2: #{dev.changes}"
次のようなログ エントリが発生します。
Update_Device changes0: {}
Update_Device changes1: {}
[1m[36mAwsvpc Load (0.2ms)[0m [1m[34mSELECT "awsvpcs".* FROM "awsvpcs" WHERE "awsvpcs"."id" = $1 LIMIT $2[0m [["id", 644], ["LIMIT", 1]]
↳ app/lib/api/api_get_asset_result_builder.rb:53:in `populate_awssubnet'
Update_Device changes12: {}
[1m[36mCACHE Awsvpc Load (0.0ms)[0m [1m[34mSELECT "awsvpcs".* FROM "awsvpcs" WHERE "awsvpcs"."id" = $1 LIMIT $2[0m [["id", 644], ["LIMIT", 1]]
↳ app/lib/api/api_get_asset_result_builder.rb:55:in `populate_awssubnet'
Update_Device changes2: {"awsaccount_id"=>[66, 644]}