2016-04-09 8 views
0

私は質問をして結果のリストを返すことができるAPIを持っています。私のアプリは配列内のオブジェクトのようなアクティブレコードに結果を処理します。私は、これらのオブジェクトをビュー全体に表示しますが、結果をフィルタリングしたいのです。非アクティブレコードモデルを適切にフィルタリングする

これを行うにはどのような方法が最適ですか?

現在、私はこのような何かをやっている:

ビュー

= form_tag path(resource), method: :get, class: "form-inline", role: "form" do 
.col-sm-3 
    = label_tag "See unlimited usage only?" 
    .clearfix 
    = select_tag "usage", options_for_select(resource.class::USAGE, params[:usage]), class: "form-control", prompt: "All usage limits" 

コントローラに複数のフィルターではありませんがあることを念頭に置い

def show 
    @media_deals = resource.media_deals 
    if params[:usage].present? 
    filter = params[:usage] 
    if filter == "unlimited" 
     @media_deals = @media_deals.find_all{|d| d.download_limit_display.casecmp("Unlimited") == 0} 
    elsif filter == "limited" 
     @media_deals = @media_deals.find_all{|d| d.download_limit_display.casecmp("Unlimited") != 0} 
    end 
    end 
end 

ベア示されたものだけ。

答えて

0

これまでのところ、あなたはかなりうまくやっていますが、間違っているわけではありませんが、私はそれをより良くする方法についていくつか提案しています。 まず、特に複数のフィルタを使用する場合は、Procに整理してください。

{ 
    unlimited: Proc.new {|d| d.download_limit_display.casecmp("Unlimited") == 0}, 
    limited: Proc.new {|d| d.download_limit_display.casecmp("Unlimited") != 0} 
} 

あなたが一箇所にすべてのフィルタを持参し、ウィッヒものに応じて、それらを収集、あなたが必要とし、このようなeachループで行くことができますこの方法:

filters.each {|filter| @media_deals.find_all! &filter} 

例えば、このような更新

OK、これは完全なサイクルです。あなたの意見は次のようになります。

= form_tag path(resource), method: :get, class: "form-inline", role: "form" do 
    .col-sm-3 
    = label_tag "See unlimited usage only?" 
    .clearfix 
    = select_tag "filters[usage]", options_for_select(resource.class::USAGE, params[:filters][:usage] if params[:filters].present?)), class: "form-control", prompt: "All usage limits" 
    .col-sm-3 
    = label_tag "Filter by date" 
    .clearfix 
    = select_tag "filters[usage]", options_for_select(resource.class::USAGE, params[:filters][:usage] if params[:filters].present?)), class: "form-control", prompt: "All dates" 

あなたのコントローラは次のとおりです。

def show 
    @media_deals = resource.media_deals 
    filters.each {|filter| @media_deals.select! &filter} if params[:filters].present? 
end 

private 

def all_filters 
    { 
    unlimited: Proc.new {|d| d.download_limit_display.casecmp("Unlimited") == 0}, 
    limited: Proc.new {|d| d.download_limit_display.casecmp("Unlimited") != 0}, 
    newest: Proc.new {|d| d.created_at <= 1.day.ago }, 
    recent: Proc.new {|d| d.created_at <= 4.days.ago }, 
    oldest: Proc.new {|d| d.created_at > 1.year.ago } 
    } 
end 

def filters 
    params[:filters].values.map {|f| all_filters[f] if f}.select &:present? 
end 

あなたには何が起こっているのかが分かります。私は一歩進んで、フィルタそのセット(all_filtersメソッド)をリソース自体に移動し、命名が乱雑になるとハッシュのハッシュに分割することをお勧めします。

+0

これはビューからコントローラにどのように実装されるのかを教えてください。 – Robbo

+0

@Robbo、私は答えを – Almaron

+0

更新しました。私はそれに行く – Robbo

関連する問題