思考 - 狮身人面像收集搜索结果的属性

时间:2014-04-29 12:51:54

标签: ruby-on-rails ruby ruby-on-rails-4 thinking-sphinx

如何获取搜索结果的属性集合?

我在Product模型中搜索了很多Category

class Product < ActiveRecord::Base
  has_many :categories

这是我的索引:

ThinkingSphinx::Index.define :product, with: :active_record do
  ###
  has category(:id), as: :direct_category_id

所以,我搜索查询

products = Product.search params[:query]
categories = Category.find(products.map(&:category_id)) # slow & bad & ugly

但这种方法是如此缓慢和糟糕。有没有办法从搜索结果中获取所有的属性而不是收集?

2 个答案:

答案 0 :(得分:1)

search       = Product.search params[:query]
search.context[:panes] << ThinkingSphinx::Panes::AttributesPane
category_ids = search.collect { |product|
  product.sphinx_attributes['direct_category_id']
}
categories   = Category.find category_ids

但是,请记住,如果在控制台中运行此命令,则第一行会评估搜索请求,因为IRB会呈现结果。这意味着无法添加该窗格......因此您希望在第一行末尾添加; ''或类似内容(再次:仅在Rails控制台中需要):

search       = Product.search params[:query]; ''

答案 1 :(得分:0)

好。我自己解决了。解决方案使用facets

首先,我们需要添加direct_category_id:

has category(:id), as: :direct_category_id, facet: true

之后,我们只需要使用

category_ids = products.facets[:direct_category_id].keys
categories = Category.where(id: category_ids)