Ruby on rails 控制器中带有作用域的Rails Searchkick
我正在制作一个搜索页面,在这个页面上我有几个过滤器,我正在尝试将它们与Searchkick集成,以查询产品 这些是我用于产品的范围 models/product.rbRuby 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)
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]) }
请参阅中的“在结果上运行其他作用域”
但是,如果应用ActiveRecordwhere
过滤器,它将取消分页。要使分页正常工作,您需要使用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})