我有TS 3.0.6,will_paginate 3.0.5和sphinx 2.0.4
我使用页面选项对搜索结果进行分页:
@products = Product.search(query_string, {
order: ordering,
ranker: :bm25,
sql: { include: :images },
with: {
price_type_for_search => min_price_conditions..max_price_conditions,
kind_cd: @params[:kind_cd],
brand_id: [*@params[:brand_ids]],
category_ids: categories_for_search,
property_value_names: [*params[:property_value_names]].map{ |s| Zlib.crc32(s) },
},
page: @params[:page],
per_page: @params[:per]
})
我收到错误
query 0 error: offset out of bounds (offset=12, max_matches=12); query 1 error: offset out of bounds (offset=12, max_matches=12); query 2 error: offset out of bounds (offset=12, max_matches=12); query 3 error: offset out of bounds (offset=12, max_matches=12)
其中12是@params [:per]值。
否则我在我的观点中使用will_paginate @products
,但我认为这并不重要。为什么我收到错误?我怎么能避免它?
我将这些参数发送到搜索:
order: :created_at
ranker: :bm25,
sql: { include: :images },
with: {
# no matter
},
page: 2,
per_page: 12
如果我发送per_page == 18& page == 2,然后我得到query 0 error: offset out of bounds (offset=18, max_matches=18) et.c.
如果我发送per_page == 12& page == 3,我在错误中得到(offset=36, max_matches=36)
。
答案 0 :(得分:1)
好的,我想我已经弄明白了。这里的问题是在上面的示例中调用了facets
方法@products
。 Facet调用不喜欢:page
和:per_page
选项,因为构面调用只有一个页面。因此,查看两个或更多搜索结果页面会产生错误。
解决方法(我在本地测试)是将大多数搜索选项放在共享方法中:
def common_search_options
{
order: ordering,
ranker: :bm25,
with: {
price_type_for_search => min_price_conditions..max_price_conditions,
kind_cd: @params[:kind_cd],
brand_id: [*@params[:brand_ids]],
category_ids: categories_for_search,
property_value_ids: [*params[:property_value_ids]],
}
}
end
然后为搜索结果和构面结果创建单独的对象:
@products = Product.search(query_string, common_search_options.merge({
sql: { include: :images },
page: @params[:page],
per_page: @params[:per]
}))
@product_facets = Product.facets(query_string, common_search_options)
当然,您希望将@ products.facets的任何引用更改为@product_facets。这将确保方面搜索没有分页选项,现在一切都应该顺利进行。