2017-01-14 67 views
1

我有一個自定義模型(不是由數據庫下的任何表映射)。這個自定義模型只是聯合許多其他表數據的結果。我想用kaminari來分頁。Kaminari:自定義模型分頁

例如:

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

然後我分頁上查看這些項目:

= paginate @custom_models 

當我運行此,我遇到例外:

未定義的方法`TOTAL_PAGES'對於陣列:0x007fb4dde63c70

我的問題是:如何使用Kaminari作爲自定義模型文件。

@Edit 我可以用雷現在,只要使用這行:

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

但現在我遇到的問題:因爲這是定製機型,我使用自定義查詢。我使用原始sql查詢和我自己使用offsetlimit關鍵字分頁。

例如,我返回25條記錄,默認的Kaminari每頁顯示25條記錄,所以我只能看到1頁。我可以查詢返回所需的全部記錄(例如1000條記錄),但我不知道如何讓Kaminari瞭解這一點並顯示足夠的頁面。

感謝

回答

2

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

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

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

但我認爲最好的方法是控制模型內的偏移/限制(分頁)。爲了向您展示如何做到這一點,讓代碼生成fetch_all_items會很有幫助。

你可以找到更多的Kaminari wiki page

更新 - 哈克!

所以,現在我們正在尋找不同的東西。不是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,雷可能還需要其他一些變量,如next_pageprev_page , 我不知道。使用相同的塊,items.class.module_eval,注入它們。

+0

我試過你的選擇。但我遇到了名爲:'undefined method'total_pages'for #Array:0x007fb4daca5288'的異常。關於分頁,我自己分頁查詢(使用偏移量和限制關鍵字)。 –

+0

如果您在模型中分頁,那麼您可能還需要手動計算頁數。請更新您的問題,詳細信息請參見代碼,型號和控制器級別 –

+0

我已更新我的問題。請看一下。謝謝 –