轮胎宝石:未定义的方法`检测'

时间:2012-05-14 22:43:21

标签: ruby-on-rails ruby elasticsearch tire

我在我的Rails应用程序中使用了一些持久的Tire模型。搜索工作正常,使用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对象,这是我的实际模型类。我在gem的github页面上看到了一些关于这个的东西,但是我没有对Tire.configuration.wrapper做任何事情。我在所有索引模型中都包含Persistence,Search和Callbacks模块。

我错过了什么吗?有人可以指点我正确的方向吗? (karmi,我希望你能把我救在这里!)

[UPDATE]

现在我到了某个地方......当一个特定索引的结果只返回结果时发生错误。如果索引有2个或更多结果,则将其包装在Tire :: Results :: Collection中。现在找个黑客......

[再次更新]

找到Hacky解决方案!请看下面的答案......

3 个答案:

答案 0 :(得分:1)

我认为在检测之前你错过了地图的大括号。它应该是这样的:

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

我不知道代码库是否足够清楚,但我认为records[item['_type']]将返回其中一个AuthoredHistory个对象,其中没有{{1}他们的方法。

detect方法用于Ruby中的detect集合,这是Enumerable返回(它将返回map)对象的对象。因此,大括号处于错误的位置。

答案 1 :(得分: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

也!之前我曾经做过一次黑客攻击,因为整个搜索结果只返回了一个项目。我不得不在上面相同的问题行之前插入这一行:

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

答案 2 :(得分:0)

现在应该在提交44eda24中修复此问题。另请参阅问题#725