1

Rails アプリで永続化されたタイヤ モデルをいくつか使用しています。を使用して、検索は正常に機能していますTire.search ['index1','index2'], :load => true do ...が、新しいインデックスとモデルを作成しました。それを検索に含めてその結果にアクセスしようとすると、次のエラーが発生します。

undefined method `detect' for #<AuthoredHistory:0x000001013d6a88>

Tire::Results::Collection#results の最後の行から来ていることがわかります。

@response['hits']['hits'].map { |item| records[item['_type']].detect { |record| record.id.to_s == item['_id'].to_s } }

何らかの理由records[item['_type']]で、私の他のモデルでは Tire::Results::Collection オブジェクトを返しますが、新しいクラスでは、実際のモデル クラスである AuthoredHistory オブジェクトを返します。宝石の github ページでこれについて何かを見ましたが、Tire.configuration.wrapper では何もしていません。すべてのインデックス付きモデルに Persistence、Search、および Callbacks モジュールを含めています。

何か不足していますか?誰かが私を正しい方向に向けることができますか? (カルミ、ここで私を救ってくれることを願っています!)

[アップデート]

今、私はどこかに到達しています...特定のインデックスからの結果が1つだけ返されたときにエラーが発生していました。インデックスからの結果が 2 つ以上ある場合は、それを Tire::Results::Collection にラップします。今ハックを見つけるために...

【再度UPDATE】

ハッキーな解決策が見つかりました!答えは以下をご覧ください...

4

3 に答える 3

1

検出の前にマップの中括弧が欠落していると思います。これは次のようになります。

@response['hits']['hits'].map { |item| records[item['_type']] }.detect { |record| record.id.to_s == item['_id'].to_s }

私はこれを確実に知るのに十分なほどコードベースを知りませんが、メソッドを持たないオブジェクトrecords[item['_type']]の1つを返すと思います。AuthoredHistorydetect

このdetectメソッドは Ruby のコレクションで使用されます。これは、返される (返される) オブジェクトEnumerableの一種です。したがって、中かっこが間違った位置にありました。mapArray

于 2012-05-14T22:53:15.623 に答える
0

うまくいくと思われるハックを見つけました...きれいなものではありませんが、それがハックの性質です。特定のモデルの結果が 1 つしかない場合、レコードはTire::Results::Collectionオブジェクトではなく、実際のモデルのオブジェクトのみを返します。これは で失敗しdetectます。したがって、コレクションがあるかどうかを確認する必要があります。コレクションがない場合は、単純に配列にラップします。今のところはうまくいっているようですが、うまくいけば、今後悪影響はありません...

これがハックです...これは、質問に投稿した問題のある行を置き換えます:

@response['hits']['hits'].map do |item|
  collection = records[item['_type']].is_a?(Tire::Results::Collection) ?
    records[item['_type']] :
    [records[item['_type']]]
  collection.detect { |record| record.id.to_s == item['_id'].to_s }
end

また!検索結果全体で 1 つのアイテムしか返されない場合を説明するために、以前にハックを行ったことがあります。上記の同じ問題のある行の直前に、この行を挿入する必要がありました。

return [records[@response['hits']['hits'].first['_type']]] if @response['hits']['hits'].size == 1
于 2012-05-15T17:41:32.910 に答える