私が何か間違ったことをしている可能性は十分にありますが!
これが話です。ActiveJob ジョブを使用した標準の初心者レベルの RoR セットアップ (4.2) があります。
私の仕事の 1 つは、渡されたレコードで、そのレコードを変更するためのメソッドを呼び出します。ここまではごく普通。次のようになります。
class GenericScraperJob < ActiveJob::Base
def perform(record)
# perform job with record data
record.update_myself!
end
end
そして、update_myself!
メソッドは次のようになります。
class RecordInDb < ActiveRecord::Base
def update_myself!
thisis_a_column = newvalue
self.save!
end
end
ここにミステリーがあります - テストを実行して、それが であることを確認するfixture_instance.thisis_a_column
とnewvalue
、テストはパスします。アプリを起動してデータベースで何が起こっているかを確認すると、期待どおりに更新されません。
しかし、私が言うとself.thisis_a_column = newvalue
、どこでも正しく機能します。
フィクスチャをリロードしたと確信しています...次のようにしました:fixture_instance = RecordinDb.find(fixture_inst.id)
インスタンス化された時期に応じて、ActiveRecord インスタンス内のバインディングが変化するかのようです。私のテストでは、シンボルは送信可能なメッセージとして扱われているように見えますself
が、ジョブではローカル名として扱われています。なんで?