質問

私は最近、私のRails(3.0.9)アプリで登場し始めた問題をデバッグしようとしています。このアプリでは、データベースで非壊れた移行が実行されたときにアプリのインスタンスを再起動する必要があります(再配置されていません)。これは以前は発生していなかったので、最近開始すべき理由が見つかりません。

私の生産環境にはいくつかのサーバーがあり、それぞれがフォークされたユニコーンインスタンスを使用しており、すべてが単一のMySQLインスタンスを共有しています。各インスタンスでは、1の接続プールを使用しています。また、ステージングデータベースに対してテストした後、ライブデータに対してテストするために最終的なステージング環境として使用される1つのサーバーもあります。

過去には、古いコードが決して見る必要のない移行である限り、再展開や生産ユニコーンサーバーを再開せずに生産DBで移行を実行することができました。たとえば、既存のテーブルに新しいオプションのフィールドを追加する - ステージングサーバーに展開されたコードはそれにデータを書き込みますが、既存のサーバーはそれを無視し、DBを使用し続けることができます。 '新しいコードを生産にプッシュする準備ができています。

しかし、最近、移行を実行した後に生産サーバーによって例外がスローされているのが見られましたが、変更されたテーブルに新しい行を挿入しようとした場合にのみです。アプリの他のすべての部分、および他のすべてのテーブルは影響を受けませんが、挿入が発生するとすぐに、これを取得します。

NoMethodError: undefined method `name' for nil:NilClass

[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/to_sql.rb:56:in `visit_Arel_Nodes_InsertStatement'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/to_sql.rb:55:in `map'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/to_sql.rb:55:in `visit_Arel_Nodes_InsertStatement'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/visitor.rb:15:in `send'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/visitor.rb:15:in `visit'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/visitor.rb:5:in `accept'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/to_sql.rb:18:in `accept'
[GEM_ROOT]/bundler/gems/rails-83fb5552b6ab/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:111:in `with_connection'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/to_sql.rb:16:in `accept'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/tree_manager.rb:20:in `to_sql'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/select_manager.rb:217:in `insert'

それらがまだ古いコードを実行しているにもかかわらず、プロダクションサーバーを再起動すると、問題はなくなります。そのため、アプリがこのエラーに達していなかったとしても、テーブルが変更されていても、テーブルが変更されたときに接続で何かが破損しているようです。

私はActivereCord/Arelを掘り下げましたが、私ができることができることは、ある時点でこのテーブルのキャッシュされたモデルがどの列を持っているかを知っていることを失うことを理論化することですが、なぜそれをするのか、なぜこれをするのかわかりません突然起こるでしょう。

正しい解決策はありません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top