Rails Searchkick 与控制器中的范围
Rails Searchkick with scopes in controller
我正在制作一个搜索页面,其中有几个过滤器,我正在尝试将它们与 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”
如何在我的搜索查询中使用范围?
错误(在撰写此答案时我不知道)可能是因为您将 with_all_categories
定义为 Product
上的 class 方法,但在您的控制器中调用它在 @results
上,它必须是 ActiveRecord::Relation
.
将它变成 scope
应该可以解决问题:
改变这个:
def self.with_all_categories(category_ids)
select(:id).distinct.
joins(:categories).
where("categories.id" => category_ids)
end
至:
scope :with_all_categories, -> (category_ids) { select(:id).distinct.joins(:categories).where("categories.id" => category_ids) }
您可以将范围应用于 Searchkick 结果:
Product.search "milk", scope_results: ->(r) { in_price_range(params[:price]) }
参见 the readme 中的 "Run additional scopes on results"。
但是,如果您应用 ActiveRecord where
过滤器,它会抛出分页。要使分页正常工作,您需要使用 Searchkick 的 where
选项:
Product.search(query, where: {price_range: 10..20})
我正在制作一个搜索页面,其中有几个过滤器,我正在尝试将它们与 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”如何在我的搜索查询中使用范围?
错误(在撰写此答案时我不知道)可能是因为您将 with_all_categories
定义为 Product
上的 class 方法,但在您的控制器中调用它在 @results
上,它必须是 ActiveRecord::Relation
.
将它变成 scope
应该可以解决问题:
改变这个:
def self.with_all_categories(category_ids)
select(:id).distinct.
joins(:categories).
where("categories.id" => category_ids)
end
至:
scope :with_all_categories, -> (category_ids) { select(:id).distinct.joins(:categories).where("categories.id" => category_ids) }
您可以将范围应用于 Searchkick 结果:
Product.search "milk", scope_results: ->(r) { in_price_range(params[:price]) }
参见 the readme 中的 "Run additional scopes on results"。
但是,如果您应用 ActiveRecord where
过滤器,它会抛出分页。要使分页正常工作,您需要使用 Searchkick 的 where
选项:
Product.search(query, where: {price_range: 10..20})