我在我的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解决方案!请看下面的答案......答案 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)