与Kaminari的分页搜索结果

时间:2011-04-02 13:13:45

标签: ruby-on-rails pagination kaminari

过去2小时我一直试图这样做但没有成功,我确信这很简单:)

因此,我有一个表单,用户可以根据某些关键字搜索内容。这是表单代码:

<%= form_tag search_by_description_path,:method => "get" do %>
        <div class="column span-3">
            <label>Search</label>
        </div>

        <div class="column span-5">
            <input type="text" name="search_keywords" id="search_keywords"/>
        </div>

        <div class="column span-6">
            <%= collection_select :category,:id,Category.all,:id,:name,:include_blank => "Everything" %>
        </div>

        <div class="column span-3">
            <%= submit_tag "search" %>
        </div>

    <% end %>

我在routes.rb

中有这个
get "search_by_description" => "search#search_by_description",:as => "search_by_description"

我在控制器中有这个:

def search_by_description
    category    = params[:category_id]
    kw          = params[:search_keywords]
    @results = Posts.where("description LIKE ?","%#{kw}%").page(params[:page])
end

忽略我没跟踪category_id的事实。在我看来,我有这个:

<%= render "results",:locals => {:results => @results} %>
<%= paginate(@results) %>

问题是,当我转到第二页时,我看不到任何显示的内容。在控制台中查看,我注意到第1页的内容生成了以下SQL:

 SELECT "posts".* FROM "posts" WHERE (description LIKE '%lorem%') ORDER BY id LIMIT 25 OF
SELECT COUNT(*) FROM "posts" WHERE (description LIKE '%lorem%')

而仅为第二个:

SELECT COUNT(*) FROM "posts" WHERE (description LIKE '%lorem%') LIMIT 25 OFFSET 25

请给我一些建议,我不想写自己的分页:)

2 个答案:

答案 0 :(得分:4)

此问题的根本原因是ActiveRecord 3.0的错误,将在ActiveRecord 3.1 https://github.com/rails/rails/commit/d5994ee中修复 https://github.com/rails/rails/commit/28c73f0

我在Kaminari上做了一个monkeypatch来使用ActiveRecord 3.0 https://github.com/amatsuda/kaminari/blob/9d0eebe38e2a22fb8100e491a6d94839d76c868f/lib/kaminari/models/active_record_relation_methods.rb#L7-11

简而言之,将您的Kaminari宝石更新为最新宝石将解决您的问题。谢谢!

答案 1 :(得分:1)

这是我身边的一个错误或误用。在我看来,我有这个:

<% if results.size > 0 %>
   ...
<% else %>
   <p>No results found</p>
<% end %>

对于不同于第一个页面的页面,这总是在else子句上。如果我将results.size更改为results.all.size则可行。但是,我不明白为什么它不能直接与results.size一起使用。