2011-08-02 17 views
0

私は、長いオプションのフィルタリングオプション(価格、プラットフォーム、可用性など)に基づいて、インターフェイスが製品テーブルを絞り込むことができるようにする必要があります。テーブルに複数の属性フィルタリングを構築するにはどうすればよいですか?

訪問者がまず価格で並べ替えることができるようにフィルタを合成し、プラットフォーム検索フィルタを既存の価格フィルタに追加する必要があります。フィルターも取り外し可能でなければなりません。

さらに、結果にはいくつかの並べ替えオプションとページ設定が必要です。

このようなものを実装する最良の方法についてのご意見はありますか?

私はhas_scopeを探しています。また、Solr/Sunspotを検索に使用しますが、提案はありません。

+0

使用しているRailsのバージョンは何ですか? – Yardboy

+0

現在実行中3.1.rc5 –

答えて

0

私はSolr/Sunspotファセットについて学習し、それらを検索基準に適用しました。

0

Rails 3 ActiveRecordは、このようなものに対処するための素晴らしい仕組みを持っています。あなたのActiveRecordにwhereまたはorderのようなメソッドを呼び出すことができ、返されるものはRelationになります。検索境界をさらに狭めるために、または結合を指定するために、そのオブジェクトに対して追加のメソッドを呼び出すことができます。実際にデータベースからRubyにデータを戻すオブジェクトのメソッドを呼び出すまで、データベースは実際にはヒットしません。ここでは詳細:

http://m.onkey.org/active-record-query-interface

http://railscasts.com/episodes/202-active-record-queries-in-rails-3

そこから、あなたが必要なのは、それ以来、私はもっときれいだと思う(セッションに保存、または可能なフィルタエレメントを追加および削除するUIであり、 URLの一部として、ブックマークとバックボタンを可能にする)。コントローラーのインデックスアクションで各フィルター要素を順番に適用できます。

1

...これは、以下のはるかに簡潔なバージョンがあり、1つの簡単な方法ですが、そのもう一つは最初にせずに理解することは困難です

考えるフィルタ条件ですpriceplatformavailability ...

フォームフィールドに適切な名前を付けてください。params hashの一部として表示されます。これは、そのフィルタフィールドの値がない限り、適切な条件で#whereを経由して、あなたのフィルターを通して段階的に説明し、それぞれ1を適用し、その後、すべての製品のプレースホルダで始まる

@products = Product.where(true) 
%w(price platform availability).each do |filter| 
    unless params[filter.to_sym].nil? 
    @products = @products.where(filter => params[filter.to_sym]) 
    end 
end 

:次に、あなたのコントローラでこのような何かを実行しますnilです。最後に、商品インスタンス変数にフィルタリングされたコレクションが保持されます。これは、ActiveRecordクラスの#whereメソッドがchainableで、別の#whereを適用できるたびにRelationオブジェクトを返すためです。

最初の.where(真)の部分はちょっとハッキリですが、入れないと、すべてのフィルタがnilでない場合、@productsはすべての製品のコレクションではなくProductクラスのオブジェクトになります。 #allメソッドは廃止されました。したがって、私は.where(true)を使用しています。これを行うためのより良い方法またはより受け入れやすい方法があるかどうかはわかりません。

Rails 3では、コレクション上でenumerable method#eachのような)を呼び出すまで、実際にDBに対して何も実行されないので、これはdbに対してうまくいくはずです。

より簡潔なバージョンはこれです...

@products = Product.where(params.select {|key, value| %w(price platform availability).include?(key.to_s) && !value.nil?}) 

あなたは#whereメソッドに条件のentire hashに渡すことができますので、これは動作します。 #of呼び出し内のparams.select部分のコードは、paramsハッシュからすべてのキーと値のペアを引き出します。ここで、キーはフィルタ条件の1つと一致しますand値はnon-nilであり、生成されたハッシュは#whereに供給されます。これは、上記のall-filters-nil issueを持たないようです。なぜなら、すべてがnilの場合、#whereは空のハッシュを取得してすべてを選択するからです。

関連する問題