6

数日前に働いていた労働者が、何らかの理由で仕事をやめました。

resqueログはMongo::OperationFailure、エラー付きの例外を報告しますinvalid operator: $oid

class SimilarTargets
  @queue = :similar_queue

  def self.perform(target_id)
    source_target = Target.find(target_id)

    ....

  end
end

Railsコンソールを介してストレート文字列が渡された場合でも、ワーカーはTarget.find(target_id)で失敗します。

Target.find(id)はコンソールやコードの他の場所で正常に機能し、先週ワーカークラスが変更されていないのに、なぜこれが失敗したのか理解できません。

4

2 に答える 2

8

最近Mongoidをアップグレードしましたか?このエラーにより、.find()メソッドが{"$oid": "[STRING]"}MongoのオブジェクトIDの厳密なjson表現であるのようなものを受信して​​いるように聞こえます。

簡単な修正が必要な場合は、次のような方法で回避できます。

target_id = target_id["$oid"] unless target_id.is_a?(String)
于 2012-07-17T04:32:19.727 に答える
1

もう 1 つのオプションは、Moped::BSON::ObjectId をキューに入れるときに、明示的に文字列表現を渡すようにすることです。例えば、

Resque.enqueue(MyJob, @mongoid_instance.class.to_s, @mongoid_instance.id.to_s)
于 2013-04-03T18:13:55.993 に答える