首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kaminari:定制模型的分页

Kaminari:定制模型的分页
EN

Stack Overflow用户
提问于 2017-01-14 03:52:46
回答 1查看 1.8K关注 0票数 1

我有一个自定义模型(不是通过数据库中的任何表进行映射)。这个自定义模型仅仅是合并了许多其他表的数据的结果。我想用kaminari来分页。

例如:

代码语言:javascript
复制
def index
   @custom_models = find_all_items # result is an array
   render
end

然后,我分页查看这些项目:

代码语言:javascript
复制
  = paginate @custom_models

当我运行这个程序时,我会遇到异常:

数组的未定义方法`total_pages‘:0x007fb4dde63c70

我的问题是:如何使用Kaminari作为自定义模型文件。

@Edit我现在可以使用Kaminari了,只需使用以下一行:

代码语言:javascript
复制
  @custom_models = Kaminari.paginate_array(@custom_models)
                  .page(params[:page]).per(params[:per_page])

但是现在我遇到了问题:因为这是自定义模型,所以我使用自定义查询。我使用原始sql查询,并使用offsetlimit关键字自己分页。

例如,我返回25条记录,默认的Kaminari是每页显示25条记录,所以我只能看到1页。我可以查询返回全部必需的记录(例如,1000条记录),但我不知道如何让Kaminari理解这一点,并向我展示足够的页面。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-14 08:11:12

首先,我假设fetch_all_items.is是一个数组。

您可以在控制器上插入分页,尽管这意味着数据库将加载整个集合,然后使用数组分页方法过滤结果。

代码语言:javascript
复制
@custom_models =  Kaminari.paginate_array(fetch_all_items).page(params[:page])

但我认为最好的方法是控制模型中的偏移量/限值(分页)。要向您展示如何做到这一点,最好有生成fetch_all_items的代码。

您可以在Kaminari wiki页面中找到更多信息

更新-hacky!

所以,现在我们看到的是一件不同的事情。不是100%肯定这就足够了,但是如果您想在模型中进行激进和分页,那么这应该是正确的方法:

在您的模型中,您应该有这样的东西(当然,为了适应您的需要,您可以这样做):

代码语言:javascript
复制
def fetch_all_items(page, per_page)
    offset = page*per_page
    items = SomeSqlMethod("select .... offset #{offset}, limit #{per_page}") # your sql statement
    total_rows = SomeSqlMethod("select count(..) ....") # to get the total number of records
    total_pages = (total_rows.to_f / per_page).ceil # to get the total pages
    items.class.module_eval { 
        attr_accessor :total_pages, :current_page
    } # to add some variables to make Kaminari happy
    items.total_pages = total_pages
    items.current_page = page
    items # to return this
end

那么,在您的控制器中,您应该有:

代码语言:javascript
复制
@custom_model = fetch_all_items(params[:page].to_i, params[:per_page].to_i) # cast to integer to avoid injections and misfunctions

除了:total_pages, :current_page,Kaminari可能还需要一些其他变量,比如next_pageprev_page,我不知道。使用相同的块,items.class.module_eval,注入它们。

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

https://stackoverflow.com/questions/41646636

复制
相关文章

相似问题

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