2016-04-09 38 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 s中。像這樣的例子:

{ 
    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} 

更新

好的,這樣的完整週期。以下是您的觀點可能的樣子。

= 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