簡體   English   中英

Kaminari:針對定制模型的分頁

[英]Kaminari: pagination for custom model

我有一個自定義模型(不通過數據庫下的任何表進行映射)。 此自定義模型只是合並許多其他表的數據的結果。 我想用kaminari對此進行分頁。

例如:

def index
   @custom_models = find_all_items # result is an array
   render
end

然后我在視圖上對這些項目進行分頁:

  = paginate @custom_models

運行此命令時,遇到異常:

數組:0x007fb4dde63c70的未定義方法`total_pages'

我的問題是:如何將Kaminari用於自定義模型文件。

@Edit我現在可以使用Kaminari,只需使用以下行:

  @custom_models = Kaminari.paginate_array(@custom_models)
                  .page(params[:page]).per(params[:per_page])

但是現在我遇到了問題:因為這是自定義模型,所以我在使用自定義查詢。 我使用原始sql查詢並使用offsetlimit關鍵字自行分頁。

例如,我返回25條記錄,而Kaminari的默認設置是每頁顯示25條記錄,因此我只能看到1頁。 我可以查詢返回全部必要的記錄(例如1000條記錄),但是我不知道如何使Kaminari理解並顯示足夠的頁面。

謝謝

首先,我假設fetch_all_items是一個數組。

您可以在控制器上插入分頁,盡管這意味着數據庫將使用數組分頁方法加載整個集合,然后過濾結果。

@custom_models =  Kaminari.paginate_array(fetch_all_items).page(params[:page])

但是我認為最好的方法是控制模型中的偏移/限制(分頁)。 為了向您展示如何做到這一點,擁有產生fetch_all_items的代碼將fetch_all_items

您可以在Kaminari Wiki頁面中找到更多內容

更新-哈克!

因此,現在我們正在研究另一件事。 並非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_pageprev_page ,我不知道。 使用相同的塊items.class.module_eval注入它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM