0

我正在通过使用acts_as_indexed 和will_paginate 来实现搜索功能。我正在使用 Ruby 1.8.7 和 Rails 2.3.11。不,我无法升级 Ruby,因为我使用的是共享主机。

定期使用“分页”方法会产生预期的结果,但是当使用“分页搜索”(acts_as_indexed 分页方法)时,我会得到奇怪的结果:

- 葡萄酒都是从数据库中检索到的(我查看了日志,查询看起来不错)
- 是分页搞砸了,产生了不一致的“每页”结果

假设搜索结果为 3 个对象:

将 per-page 设置为 1,得到 18 页,除了第 4、12 和 18 页之外都没有结果
将 per-page 设置为 2,得到 9 页,除了第 2、6 和 9 页之外,所有页面都没有结果(在这里看到一个模式?)
设置每页到 3,除了第 2、4 和 6 页之外,得到 6 页没有结果
- 以上所有模式每个结果页产生 1 个结果

等等等等......似乎有一些时髦的数学正在发生,但我不知道在哪里或为什么。

4

1 回答 1

0

好的,我想出了解决这个问题的方法。本质上,我在搜索功能中设置了一个条件,这只是以某种方式搞砸了。这是一个简单的“stock > 0”字符串,我不知道为什么它会与acts_as_indexed 混淆,但无论如何。解决方法是添加一个名为“stocked”的搜索属性。任何有库存的产品都可以通过“库存”一词进行搜索,而任何没有库存的葡萄酒都不会具有该属性。我没有在搜索方法中加入 :conditions 参数,而是在必要时将“stocked”字符串附加到搜索字符串中。现在可以了。下面的代码片段:

Wine.rb

# ... = indicates other attributes
acts_as_indexed :fields => [..., :stock_search]

def stock_search
    'stocked' if stock > 0
end

wines_controller.rb

srch = "#{ safe_tags * " " }#{ ' stocked' if params[:search_all].nil? }"
@wines = Wine.paginate_search(srch, :page => pg, :per_page => 10, :include => [{:awards => [:medal, :competition]}, {:reviews => :reviewer}])

回顾一下:

这有效:Wine.paginate_search("cabernet stocked", :page => pg, :per_page => 10)

这不会:Wine.paginate_search("cabernet", :conditions => "stock > 0", :page => pg, :per_page => 10)...从技术上讲,搜索有效,但分页无效。

希望这对遇到同样问题的人有所帮助。

于 2013-02-10T05:16:10.700 回答