首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Kaminari对搜索结果进行分页

使用Kaminari对搜索结果进行分页
EN

Stack Overflow用户
提问于 2011-04-02 21:13:45
回答 2查看 3.7K关注 0票数 0

在过去的两个小时里,我一直在尝试这样做,但没有成功,我相信这是非常简单的事情:)

所以,我有一个表单,用户可以根据一些关键字进行搜索。下面是表单代码:

代码语言:javascript
复制
<%= 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里有这个

代码语言:javascript
复制
get "search_by_description" => "search#search_by_description",:as => "search_by_description"

我在控制器中有这个:

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

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

代码语言:javascript
复制
<%= render "results",:locals => {:results => @results} %>
<%= paginate(@results) %>

问题是,当我转到第二页时,我没有看到任何显示。查看控制台时,我注意到第一个页面生成了以下SQL:

代码语言:javascript
复制
 SELECT "posts".* FROM "posts" WHERE (description LIKE '%lorem%') ORDER BY id LIMIT 25 OF
SELECT COUNT(*) FROM "posts" WHERE (description LIKE '%lorem%')

而只针对第二个:

代码语言:javascript
复制
SELECT COUNT(*) FROM "posts" WHERE (description LIKE '%lorem%') LIMIT 25 OFFSET 25

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-05 10:15:51

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

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

简而言之,将Kaminari gem更新到最新版本可以解决您的问题。谢谢!

票数 4
EN

Stack Overflow用户

发布于 2011-04-02 22:05:10

从我的角度来说,这是一个bug,或者是滥用。我的观点是:

代码语言:javascript
复制
<% if results.size > 0 %>
   ...
<% else %>
   <p>No results found</p>
<% end %>

对于与第一页不同的页面,这总是在else子句中进行。如果我将results.size更改为results.all.size,它就可以工作。然而,我不明白为什么它不能直接与results.size一起工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5523367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档