Rails Searchkick与控制器中的范围

时间:2018-07-03 18:24:38

标签: ruby-on-rails ruby searchkick scopes

我正在制作一个搜索页面,该页面的侧面有几个过滤器,并试图将它们与Searchkick集成以查询产品。

这些是我用于产品的示波器

models / product.rb

scope :in_price_range, ->(range) { where("price <= ?", range.first) }    
scope :in_ratings_range, -> (range) { where("average_rating >= ?", range.first) }

def self.with_all_categories(category_ids)
    select(:id).distinct.
    joins(:categories).
    where("categories.id" => category_ids)
end

这是我实际调用作用域的地方

controllers / search_controller.rb

@results = Product.search(@query)
@results = @results.with_all_categories(params[:category_ids]) if params[:category_ids].present?
@results = @results.in_price_range(params[:price]) if params[:price].present?
@results = @results.in_ratings_range(params[:rating]) if params[:rating].present?

运行它后,我收到一条错误消息,指出searchkick模型没有使用我的作用域名称的任何方法。

#Searchkick :: Results:0x00007f4521074c30的未定义方法`with_all_categories'

如何在搜索查询中使用范围?

2 个答案:

答案 0 :(得分:1)

您可以通过以下方式将范围应用于Searchkick结果:

Product.search "milk", scope_results: ->(r) { in_price_range(params[:price]) }

请参见the readme中的“对结果运行其他范围”。

但是,如果您应用ActiveRecord where过滤器,它将导致分页。为了使分页正常工作,您需要使用Searchkick的where选项:

Product.search(query, where: {price_range: 10..20})

答案 1 :(得分:0)

错误(写此答案时我不知道)可能是因为您在with_all_categories上将Product定义为类方法,但是在控制器中您在{{1}上调用了它},它必须是@results

将其转换为ActiveRecord::Relation应该可以解决此问题:

更改此:

scope

收件人:

def self.with_all_categories(category_ids)
  select(:id).distinct.
    joins(:categories).
    where("categories.id" => category_ids)
end