2012-05-14 96 views
1

我在我的Rails應用程序中使用了幾個持久輪胎模型。搜索一直做工精細,用Tire.search ['index1','index2'], :load => true do ...但我現在做了一個新的指標和模型,並試圖將其包括在搜索時,我收到以下錯誤並訪問其結果:輪胎寶石:undefined方法`檢測'

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

我看到它是從輪胎來::結果::收藏#結果,在下跌的最後一行:

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

出於某種原因records[item['_type']]返回一個輪胎::結果:: Collection對象爲我的其他車型,但隨着新的類,它返回一個AuthoredHistory對象,這是我的實際模型類。我在gem的github頁面上看到了一些關於此的內容,但我沒有對Tire.configuration.wrapper做任何事情。我在所有索引模型中都包含了持久性,搜索和回調模塊。

我錯過了什麼嗎?有人可以請指點我正確的方向嗎? (果報工作者,我希望你能救我在這裏!)

[更新]

現在我得到的地方......當從一個特定的指數只有1個結果與返回的錯誤發生在結果。如果索引中有2個或更多結果,則將其包含在Tire :: Results :: Collection中。現在找一個黑客...

[再次更新]

哈克解決方案找到了!看下面的答案...

回答

0

我發現了一個我認爲可行的黑客......不是一個漂亮的黑客,但這就是黑客的本質。如果某個特定型號只有一個結果,記錄不會返回一個Tire::Results::Collection對象,而只是實際模型的一個對象,該對象在detect上失敗。所以,我必須檢查我們是否有Collection,如果沒有,只需將它包裝在一個數組中。它似乎對現在的工作,希望有任何不良影響的道路......

這裏是黑客...這將替換我張貼的問題,有問題的行:

@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 

ALSO !我之前做過一次破解,以說明搜索結果作爲整體只返回一個項目的時間。我有上述相同問題的行權之前插入此行:

return [records[@response['hits']['hits'].first['_type']]] if @response['hits']['hits'].size == 1 
1

我想你在檢測之前缺少地圖的大括號。它應該是這樣的:

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

我不知道該代碼庫不夠好,知道這一點是肯定的,但我認爲records[item['_type']]將被遣返那些AuthoredHistory對象,它不具備detect方法之一在他們。

detect方法是Ruby Enumerable集合使用,這是一種反對說map回報(它會返回一個Array)對象。因此,花括號的位置是錯誤的。

+0

這絕對是合理的邏輯..但使用這會導致更多的錯誤。不確定這是否是解決方案,因爲所涉及的產品線包含在寶石中? –