2009-06-30 20 views
7

私はwill_paginateプラグインを通して連続したページに分割された写真をいくつか持っています。写真を開いてリンクを使用してすべての写真に戻ると、最初のページに戻ります(たとえば、5ページ目に写真が表示され、写真を開き、すべての写真を表示するリンクをクリックして、もう一度、5ページ目をご覧ください)。アイテムのページとwill_paginate

ここで、写真が属するページ番号を取得する方法はありますか?

私はGETパラメータを渡そうとしましたが、ユーザがこれ以上アクションを実行しない場合(例:コメントの投稿、写真の編集、ecc)のみ動作します。

答えて

8
page = (number_of_records_before_RECORD/number_of_records_per_page) + 1 

つまり、あなたの写真は、ID 40を持っており、25枚のレコードはページごとに20件のレコードで、(一部のレコードが削除されたと仮定した場合)の前にある場合:

page = (25/20) + 1 = 2 

あなたはModel.count(:conditions => ['id < ?', record.id], :order => 'id')を使用して、選択したレコードの前のレコード数をカウントすることができます。 正しいクエリは、すべてのオブジェクトをリストするときに、そのテーブルに適用するソートフィルタによって異なります。

+0

これは解決策ですが、このコードがプラグインでデフォルトでは実装されていないのは不思議です。パフォーマンスに関して言われたことをするのは意味がありません。 – collimarco

+0

Becau実際には幅広い視聴者には意味をなさない。これは完璧な解決策ではなく、あなたの特定の必要性に対する回避策です。また、will_paginateは、追加のActiveRecord機能ではなく、ページ区切り機能を提供します。 –

+1

私はそれが巨大なパフォーマンスヒットになるとは思わなかったでしょう。ページネーションライブラリを使用している場合、ページング総数を得るためにページングしているすべてのものがカウントされます。注文している列が正しく索引付けされている場合は、現在のページを見つけるために同様の数を取得するのは面倒ではありません。 – Shadwell

0

ページ番号は検索結果に大きく左右されます。結果セットと1ページあたりの項目数に応じて、1ページ、10ページ、または100ページの検索が可能です。

"すべての写真を表示"するリンクには、説明したようにGETパラメータを使用して、検索と改ページの情報を含めることができます。または、ユーザーが新しい検索をクリアまたは選択するまで検索結果が保持されるように、Cookieを介して格納および検索します。

+0

問題は、ユーザーが一時的に写真ページを去ってから(例えば修正する)、すべての写真を表示するために戻ってきたら、常に最初のページに戻ります:( 私は使用しないと思うクッキーそれはSEOのために良いことです。 – collimarco

+1

@コリマールコリクエストとリクエストの間で検索パラメータとページ番号パラメータを再利用したい場合は、どこかでそれらを保持する必要があります。 –

+0

私は多くの写真サイト(deviantart.comなど)がクッキーを使ってユーザーに戻ることができることを知りました – collimarco

0

ここで別の解決策があります:will_paginateはクエリ文字列パラメータ 'search_field'と 'page'を使用します。 Railsのparamsハッシュからこれらを抽出することができます。セッション状態を使用しているセッションを追跡している場合は、必要に応じてコントローラコードでそれらを再適用できます。

あなたの管理方法は、アプリケーションによって異なります。私が作業しているアプリケーションでは、一般的なコンテキストとメンバコンテキストを区別できるような流れです。ユーザーはメンバー#indexページからメンバーコンテキストを入力します。だから私は、メンバコンテキストへのエントリにsession [:member_context]を設定するだけです。例えばメンバー#編集で次にメンバー#indexには、次のコードがあります。

if session[:member_context] 
    @search_field = session[:search_field] 
    @page = session[:page] 
    # toggle out of member context 
    session[:member_context] = nil 
else 
    @search_field = params[:search_field] 
    @page = params[:page] 
    # record lastest search in case the user subsequently enters the member context 
    session[:search_field] = @search_field 
    session[:page] = @page 
end 
@members = Member.where(<use @search_field>).page(@page) 
# and render ... 

これは私のアプリケーションでうまくいきます。

関連する問題