Ruby on rails 控制器中带有作用域的Rails Searchkick

Ruby on rails 控制器中带有作用域的Rails Searchkick,ruby-on-rails,ruby,searchkick,scopes,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)

我正在制作一个搜索页面,在这个页面上我有几个过滤器,我正在尝试将它们与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
运行它之后,我得到一个错误,说searchkick模型没有任何使用我的作用域名称的方法

Searchkick::Results:0x00007f4521074c30>

如何在搜索查询中使用作用域?

错误(在编写此答案时我不知道)可能是因为您在
产品上定义了
作为类方法,但在控制器中,您在
@results
上调用它,它必须是
ActiveRecord::Relation

将其转换为
范围
应该可以解决此问题:

更改此项:

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


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

Product.search "milk", scope_results: ->(r) { in_price_range(params[:price]) }
请参阅中的“在结果上运行其他作用域”

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

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

您的范围中的
参数
在价格范围中
在评级范围中
未正确使用。如果您只使用
范围。首先在查询中使用
,那么为什么要传递整个范围?您能显示准确的错误消息吗?代码目前是这样的,因为我计划将来将其更改为实际范围,但现在我正试图让它工作,我收到了一条错误消息:对于#@JagdeepSinghI,未定义的方法'with_all_categories',但是我的其他作用域也会遇到同样的错误
Product.search "milk", scope_results: ->(r) { in_price_range(params[:price]) }
Product.search(query, where: {price_range: 10..20})