1

我在我的 Rails 应用程序中使用了一些持久的轮胎模型。搜索一直工作正常,使用Tire.search ['index1','index2'], :load => true do ...但我现在创建了一个新的索引和模型,尝试将其包含在搜索中并访问其结果时出现以下错误:

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

我看到它来自 Tyre::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 做任何事情。我在所有索引模型中都包含持久性、搜索和回调模块。

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

[更新]

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

[再次更新]

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

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']]将返回其中一个AuthoredHistory没有detect方法的对象。

detect方法用于EnumerableRuby 的集合中,这是一种map返回(它会返回一个Array)对象的对象。因此,花括号的位置错误。

于 2012-05-14T22:53:15.623 回答
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
于 2012-05-15T17:41:32.910 回答
0

这现在应该在 commit 中修复44eda24。另见问题#725

于 2013-05-12T09:33:29.683 回答