我有一个基于思考sphinx的搜索结果的控制器。 find_kind_cd
和find_category_ids
都是狮身人面像范围。
@products.search
返回一个数组。我需要类似ActiveRecord :: Relation之类的东西,因为我想实现一些方法,比如includes
或maximum
。如何用数组实现这个方法?
@products = Product.find_kind_cd(Product.product)
@category = Category.find_by(id: params[:category])
@products = @products.find_category_ids(@category.subtree_ids) if @category
@products = @products.search(params[:query]) if params[:query].present?
# TODO includes - bullet gem
@products = @products.page(params[:page]).per(params[:per] || 12)
答案 0 :(得分:3)
搜索结果不能是ActiveRecord::Relation
,因为您要查询Sphinx,而不是数据库。你实际得到的不是一个数组,而是一个ThinkingSphinx::Search
的实例,其行为与数组非常相似。
但是,搜索调用会被延迟评估,而page
和per
是ThinkingSphinx::Search
上可用的方法,因此您可以使用这些方法。至于includes
,您需要执行以下操作:
@products = @products.search(:sql => {:include => :category})
虽然没有像maximum
这样的东西。但是如果您确实希望基于Sphinx搜索结果从数据库中进行聚合,那么这应该可以解决问题:
Product.where(id: Product.search_for_ids(params[:query]).to_a).maximum(:cost)