[英]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查詢並使用offset
和limit
關鍵字自行分頁。
例如,我返回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_page
, prev_page
,我不知道。 使用相同的塊items.class.module_eval
注入它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.