2017-01-14 3 views
1

私はカスタムモデルを持っています(データベースの下にあるテーブルによってマッピングされていません)。このカスタムモデルは、多くの他のテーブルのデータを結合した結果にすぎません。私はこれをページ付けするためにカミナリを使いたい。例えばカミナリ:カスタムモデルのページ設定

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レコードを返し、カミナリのデフォルトでは25ページの各ページが表示されるので、1ページしか見ることができません。私は、必要なレコード(たとえば1000レコード)を返すためのクエリを作成できますが、私はKaminariがこれを理解して十分なページを表示する方法を知らないのです。

答えて

2

がで開始する

おかげで、私はfetch_all_itemsが配列を.isと推定します。

コントローラにページネーションを挿入することもできますが、これはデータベースがコレクション全体をロードしてから配列のページ区切り方法を使用して結果をフィルタ処理することを意味します。

@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 

をお使いのコントローラでは、その後、あなたが持っている必要があります::total_pages, :current_pageから離れて

@custom_model = fetch_all_items(params[:page].to_i, params[:per_page].to_i) # cast to integer to avoid injections and misfunctions 

、雷もnext_pageprev_pageのように、いくつかの他の変数が必要になる場合があります、 知りません。同じブロックitems.class.module_evalを使用して注入します。

+0

私はあなたの選択肢を試しました。しかし、私はビューファイルで例外を満たしています: '未定義のメソッド 'total_pages' for #Array:0x007fb4daca5288'。ページネーションについて、私は自分自身でクエリをページ付けします(offsetキーワードとlimitキーワードを使用します)。 –

+0

モデル内で改ページした場合は、手動でページ数を計算する必要があります。モデルとコントローラのレベルについて、コードの点で詳細をあなたの質問に更新してください。 –

+0

私は自分の質問を更新しました。見てください。ありがとう –

関連する問題