我有一个自定义模型(不是通过数据库中的任何表进行映射)。这个自定义模型仅仅是合并了许多其他表的数据的结果。我想用kaminari来分页。
例如:
def index
@custom_models = find_all_items # result is an array
render
end然后,我分页查看这些项目:
= paginate @custom_models当我运行这个程序时,我会遇到异常:
数组的未定义方法`total_pages‘:0x007fb4dde63c70
我的问题是:如何使用Kaminari作为自定义模型文件。
@Edit我现在可以使用Kaminari了,只需使用以下一行:
@custom_models = Kaminari.paginate_array(@custom_models)
.page(params[:page]).per(params[:per_page])但是现在我遇到了问题:因为这是自定义模型,所以我使用自定义查询。我使用原始sql查询,并使用offset和limit关键字自己分页。
例如,我返回25条记录,默认的Kaminari是每页显示25条记录,所以我只能看到1页。我可以查询返回全部必需的记录(例如,1000条记录),但我不知道如何让Kaminari理解这一点,并向我展示足够的页面。
谢谢
发布于 2017-01-14 08:11:12
首先,我假设fetch_all_items.is是一个数组。
您可以在控制器上插入分页,尽管这意味着数据库将加载整个集合,然后使用数组分页方法过滤结果。
@custom_models = Kaminari.paginate_array(fetch_all_items).page(params[:page])但我认为最好的方法是控制模型中的偏移量/限值(分页)。要向您展示如何做到这一点,最好有生成fetch_all_items的代码。
您可以在Kaminari wiki页面中找到更多信息
更新-hacky!
所以,现在我们看到的是一件不同的事情。不是100%肯定这就足够了,但是如果您想在模型中进行激进和分页,那么这应该是正确的方法:
在您的模型中,您应该有这样的东西(当然,为了适应您的需要,您可以这样做):
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那么,在您的控制器中,您应该有:
@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_page,prev_page,我不知道。使用相同的块,items.class.module_eval,注入它们。
https://stackoverflow.com/questions/41646636
复制相似问题