Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 斯芬克斯收集搜索结果属性的思考_Ruby On Rails_Ruby_Ruby On Rails 4_Thinking Sphinx - Fatal编程技术网

Ruby on rails 斯芬克斯收集搜索结果属性的思考

Ruby on rails 斯芬克斯收集搜索结果属性的思考,ruby-on-rails,ruby,ruby-on-rails-4,thinking-sphinx,Ruby On Rails,Ruby,Ruby On Rails 4,Thinking Sphinx,如何获取搜索结果的属性集合 即 我在产品模型中搜索,其中有许多类别: class Product < ActiveRecord::Base has_many :categories 所以,我通过查询进行搜索 products = Product.search params[:query] categories = Category.find(products.map(&:category_id)) # slow & bad & ugly 但这种方法是如此缓慢

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

我在
产品
模型中搜索,其中有许多
类别

class Product < ActiveRecord::Base
  has_many :categories
所以,我通过查询进行搜索

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

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

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

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
首先,我们需要添加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)

您的方法似乎只获得前20条记录。我尝试过(在启用分页之前)
search.size#=>20
search.count#=>6396
,而对于
#collect
#每个
方法只有20个产品。Sphinx分页结果-这是没有办法的,但您可以请求非常大的页面大小。虽然如果您需要1000条以上的记录,请阅读文档:为什么我得到20条,而不是默认的1000条?我曾尝试将
每页粘贴
选项,专门用于收集至少1000条记录的结果,但遇到了一些困难,例如急于加载庞大的数组和分页(分页后将无法工作)。鉴于数据量巨大,也许这不是获得所需数据结果的最佳方式?加载所有类别的目的是什么?
has category(:id), as: :direct_category_id, facet: true
category_ids = products.facets[:direct_category_id].keys
categories = Category.where(id: category_ids)