2010-12-27 8 views
0

company_name、posted(日付)、location(lat/lng pair)などの属性を含むモデルがあります。インデックスビューでは、私はwill_paginate gemを使用して結果セットを分割します。集計に基づいた動的フィルタを使用するフィルタレール3モジュール

私は、クエリの結果に基づいて動的フィルタを組み込みたいと思います。たとえば、エージングバケットが選択されている場合、他のフィルタはこの制限に基づいています。理想的には、私は周波数によっていくつかの値を並べ替えることができます。ような何か:

Posted: [ 0 (24) | 30 (51) | 60 (45) | 90+ (555) ] 
Company: [ Company X (53) | Company AAA (44) | ... ] 
Locations: [ New York (100) | Paris (51) | ... ] 

は、私は現在のページのみの結果が含まれ(例えば@foos)結果のコレクションに基づいて集計を計算するヘルパー関数を使用しますが、will_paginate宝石のコレクションについて考えました。おそらく、結果セット全体にアクセスする方法があります。

私は、一連のSQL文を実行して各フィルタの頻度値を計算することができたと思いますが、これを効率的に行う方法があると考えていました。

答えて

0

私は、次のアプローチにいくつかの成功を収めてきました:

コントローラ:

... 
# WHERE clause 
@foos = @foos.posted(params[:posted]) if params[:posted].present? 

# clone recordset 
@companies = @foos.clone 

# set ORDER BY/pagination 
@foos = @foos.order_by(params[:sort], params[:dir]).paginate(:per_page => Foo.per_page, :page => params[:page]) 
... 

ビュー:

... 
Company: [ 
<% @companies.group_by(&:company_name).sort.each do |company, foos| %> 
    <%= "#company.name} (#{foos.length})" %> | 
<% end %> 
] 
... 

は、おそらくこれを行うにはドライヤー/より効率的な方法があります。

関連する問題