2012-03-12 14 views
0

かなり簡単な問題のための解決策を探していますが、説明がわかりません。列フィルタオプションをビューに追加する方法(「レールの方法」を実行する)

  • フォームは新しい要素と
  • (will_paginateを使用して)既存の要素のページ分割リストを入力する:

    は、私が現在持っているどのような(ワーキング)が含まれ、インデックス図です。

私はデータの一部のみに興味がありますので、フィルタオプション付きのフォームを追加しようとしています。フォームコンテンツをクッキーに保存したいと思います。データベースに格納されているユーザーオブジェクトですが、ユーザーはまだいません)。私が理解できないことは、クッキーに格納されたフォームから値を取得する方法(およびその逆)とwill_paginatedと一緒に使用する方法です。

私は現在、コントローラに@filterオブジェクトを作成し、このオブジェクトのフィルタフォームを追加して、インデックスオプションを再度使用するようにフォームオプションを設定します。これにより、paramsハッシュで指定されたフィルタパラメータが(URLに表示される)インデックスコントローラに渡されます。しかし、この解決策にはいくつかの欠点がある。最初に、ビューを変更する(たとえば、新しい要素を作成する)とすぐにフィルタがなくなり、2番目に@filterオブジェクトがクッキーになるはずです。ここで

は私が持っているコードは、これまでです:

ビュー部分フィルタ用:

<%= form_for(@filter, :url => {:action => "index"}, :html => {:method => :get}) do |f| %> 
    <div class="field"> 
    <%= f.label :german %><br /> 
    <%= f.check_box :german %> 
    </div> 
    <div class="actions"> 
    <%= f.submit "Filter" %> 
    </div> 
<% end %> 

コントローラー:

def index 
    @word = Word.new 
    @filter = Word.new(params[:word]) 
    @words = Word.paginate(:page => params[:page]).order('word') 
    # .... 

誰も私を助けることができますか?そのような機能(フィルタリング結果)は他のアプリケーションでどのように行われますか?

+0

"フィルタ"とは、データベースのレコードの一部ではなく全てを必要としているということですか?最初は、あなたがほんの一部のコラムを望むということを意味していたと思いました。最初の場合は 'where'句を使います。たとえば、' Word.where( "language =?"、params [:language]) 'のようにします。 –

+0

はい、レコードをフィルタリングしたいと思います。 – theldoria

+0

あなたのヒントはちょっと助けになりました。チェックボックスには次の行があります: '@words = Word.paginate(:page => params [:page])。order( 'word')。ドイツ語=? "、params [:word] [:german]!=" 0 ")'。声明の順序が重要かどうか(例:パフォーマンス)私が理解する限り、これはそうではありません。 – theldoria

答えて

0

質問の答えは、一致するレコードのみを結果に含めるためにwhere句を使用することです。

@words = Word 
    .where("german = ?", params[:word][:german] != 0") 
    .order('word') 
    .paginate(:page => params[:page]) 

これは、一般的に古い見つけるとfind_byメソッドを置き換える必要がありますアクティブな関係(略してAREL)と呼ばれる新しいRailsの構文です。パフォーマンスを向上させることができるいくつかの利点があります。特に、実行するSQL(ログに表示されるSQL)は、宣言されたときではなく、参照されたときにのみ発生します。これにより、部分的な関係(名前付きスコープの場合でも)を定義し、より簡単なステートメントを作成して組み合わせることができます。

様々な句の順序は重要ではありません

- ARELは、同じSQLを生成しますが、一般的に私は、基礎となるSQLの順序に従うのが好き、

  • に参加し
    • グループ
    • ため
    • 限界
    01オフセット

    (制限とオフセットは、ページ設定ツールでケース内で処理されます)。

  • +0

    私のコントローラの下の答えで、 'session [:word] = params [:word] if params [:word]; @filter = Word.new(session [:word]) 'と' @words = Word.where( "german =?"、session [:word] [:german]!= "0" ).paginate(:page => params [:page]) '。 Cookieの代わりにセッションを使用しました(Cookieにハッシュを格納するとエラーメッセージが表示されました)。しかし、それは良い出発点です... – theldoria

    +0

    私がまだ見逃しているのは、よりインタラクティブで、b)URLを汚染しない解決策です。私はAJAXを使用しなくてはならないと思います。また、ブール値のフィルタオプションはtri-state:非選択、true、falseのため、フィルタフォームに使用するオブジェクトはクラスWordであってはいけません。ここで私はいくつかのJavaScriptやCSSのソリューションを使用しなければならないかもしれません。[tristate-checkbox](https://github.com/supernifty/tristate-checkbox)のようなものかもしれません – theldoria

    +0

    これは別の質問としてお聞きしたいと思うかもしれません。 –

    関連する問題