Sidekiqでキューに入れられたジョブで実行しているときに、モデルの1つで特定のコード行でいくつかの異なるエラーが発生します。問題のコードは次のとおりです。
@lookup_fields[:asin] ||= self.book_lookups.find_by_name("asin").try(:value)
私はundefined method 'scope' for #<ActiveRecord::Associations::AssociationScope:0x00000005f20cb0>
またはを取得しundefined method 'aliased_table_for' for #<ActiveRecord::Associations::AliasTracker:0x00000005bc3f90>
ます。
別のSidekiqジョブの別のコード行で、エラーが発生しますundefined method 'decrypt_and_verify' for #<ActiveSupport::MessageEncryptor:0x00000007143208>
。
これらのエラーはすべて、Railsランタイムサポートライブラリの標準メソッドであるため、意味がありません。
問題のモデルには、「book_lookups」モデルに対して定義された:has_many関連付けがあり、「name」と「value」は「book_lookups」モデルのフィールドです。これは、処理された最初の1〜3レコードで常に発生します。Sidekiqジョブの外部で同じコードを実行した場合、これらのエラーは発生しません。
Herokuでホストされている本番環境でのみ、開発マシンでエラーを再現できません。
コード`BookLookup.new()'をイニシャライザーに配置し、Sidekiqがスレッドを作成する前にモデルを強制的にロードすることで、最初のエラーセットを「解決」した可能性があります。あと一晩だけの作業なので、トレンドが続くかどうかを確認する必要があります...
これで当面の問題が解決したとしても、使用する前にクラスが完全にロードされないという本当の根本的な問題は解決しないと思います。クラスローディングは不可分操作ですか?あるスレッドがクラスのロードを開始し、別のスレッドが完全にロードされる前にクラスの使用を開始することは可能ですか?