2017-03-07 4 views
1

Der Titel mag verwirrend scheinen, aber schlecht erklären, was ich implementieren möchte.Filterliste Ergebnisse mit einem primären Filter "mit Multi" und einem sekundären Filter "nur eine"

Was ich will: ich ein conatainer-list will, die alle „Kategorien“ in dem agreement Modell writing_type, so dass jede Vereinbarung eine writing_type durch Zeichenfolge mit dem Namen enthält. Diese container-list wird natürlich mehrere verschiedene writing_types haben. Standardmäßig werden alle Schreibtypen angezeigt. Wenn Sie ein oder mehrere writing_type 's auswählen, wird die Liste die Ergebnisse nach writing_type filtern.

  • Zum Beispiel

  • geladen Seite und die Liste enthält alle Schreiben Typen und alle Zeilen in DESC.

  • Container-Liste, die die folgenden Schreibtypen "Onclick Highlights ausgewählt writing_type blau, können mehrere auswählen oder abwählen" hat

  • writing_types: {college_essay, college app, foreign language}

  • ich wählen college_essay und foreign language

  • Ergebnisse kommen nur mit dem College-Aufsatz und der Fremdsprache

    heraus

    nächstes klicken i die Schaltfläche namens Filter durch duedate

  • noch die Ergebnisse college_essay enthalten und foreign_language und wird von duedate DESC filtern.

  • wird es viele verschiedene Buttons werden neben due_date wie create_at oder price jedoch nur eine dieser sekundären Filter zu einem Zeitpunkt ausgewählt werden können

-Jetzt direkt neben dem Drop-Down-Tasten für die Sekundär sind Filter

Momentan ist dies der Code, den ich gerade jetzt mit einem Drop-Down habe, aber sie filtern alle einzeln. Ich bin nicht sicher, wie man die writing_type zuerst und dann durch Klicken auf eine der Tasten wie created_at zu filtern.

enter image description here

<!-- filters for the categories --> 
 
<div class="row text-center" style="margin:0;padding-bottom:10px;"> 
 
<div class="center" style="margin-left:18px;"> 
 
<div style="float:left;"> 
 
<%= link_to "Title", title_agreements_path, class: "link btn categories-button" %> 
 
</div> 
 
<!-- drop down with the writing types listed --> 
 

 
<div class="agreements dropdown" style="float:left;margin-top:40px;"> 
 

 
<%= link_to '#', class:'btn categories-button dropdown-toggle', role:'button', style: 'text-decoration:none', 'aria-expanded' =>'false', data:{toggle: 'dropdown'} do %> 
 
Writing Type 
 
<span class="caret"></span> 
 
<% end %> 
 
<ul class="dropdown-menu" style=""> 
 

 

 
<h>Choose a Writing Type:</h> 
 
<li><%= link_to "College Applications", collegeapplication_agreements_path, class: "link btn categories-button" %></li> 
 
<li><%= link_to "College Essays", collegeessay_agreements_path, class: "link btn categories-button" %></li> 
 
<li><%= link_to "Business Papers", businesspaper_agreements_path, class: "link btn categories-button" %></li> 
 

 
<li><%= link_to "Resumes", resume_agreements_path, class: "link btn categories-button" %></li> 
 
<li><%= link_to "Scholarship Essays", scholarshipessay_agreements_path, class: "link btn categories-button" %></li> 
 
<li><%= link_to "High-School Essays", highschoolessay_agreements_path, class: "link btn categories-button" %></li> 
 
<li><%= link_to "Language Translation", languagetranslation_agreements_path, class: "link btn categories-button" %></li> 
 
</ul> 
 
</div> 
 

 
<div style="float:left;"> 
 
<%= link_to "Recent", recent_agreements_path, class: "link btn categories-button" %> 
 
</div> 
 
<div style="float:left;margin-top:40px;"> 
 
<%= link_to "Oldest", oldest_agreements_path, class: "link btn categories-button" %> 
 
</div> 
 

 

 
<div style="float:left;"> 
 
<%= link_to "Close Duedate", recentduedate_agreements_path, class: "link btn categories-button" %> 
 
</div> 
 
<div style="float:left;margin-top:40px;"> 
 
<%= link_to "Further Duedate", oldestduedate_agreements_path, class: "link btn categories-button" %> 
 
</div> 
 
<div style="float:left;"> 
 
<%= link_to "Lowest Price", lowestprice_agreements_path, class: "link btn categories-button" %> 
 
</div> 
 
<div style="float:left;margin-top:40px;"> 
 
<%= link_to "Highest Price", highestprice_agreements_path, class: "link btn categories-button" %> 
 
</div> 
 

 
</div> 
 

 
</div>

routes.rb

resources :agreements, path: "agreement" do 
    collection do 
    get :recent 
    get :oldest 
    get :recentduedate 
    get :oldestduedate 
    get :collegeapplication 
    get :collegeessay 
    get :businesspaper 
    get :resume 
    get :scholarshipessay 
    get :highschoolessay 
    get :languagetranslation 
    get :title 
    get :lowestprice 
    get :highestprice 
end 
end 

Vereinbarung.rb Modell

scope :recent, ->{ order("created_at DESC") } 
scope :oldest, ->{ order("created_at ASC") } 
scope :recentduedate, ->{ order("due_date DESC") } 
scope :oldestduedate, ->{ order("due_date ASC") } 
scope :lowestprice, ->{ order("current_price ASC") } 
scope :highestprice, ->{ order("current_price DESC") } 
scope :collegeapplication, ->{ where("writing_type = ?", "College Applications") } 
scope :collegeessay, ->{ where("writing_type = ?", "College Essays") } 
scope :businesspaper, ->{ where("writing_type = ?", "Business Papers") } 
scope :resume, ->{ where("writing_type = ?", "Resumes") } 
scope :scholarshipessay, ->{ where("writing_type = ?", "Scholarship Essays") } 
scope :highschoolessay, ->{ where("writing_type = ?", "High-School Essays") } 
scope :languagetranslation, ->{ where("writing_type = ?", "Language Translation") } 
scope :title, ->{ order("title DESC") } 
def index 
    @agreements = Agreement.where("accepted = ?", false).all.paginate(:page => params[:page], :per_page => 20) 

end 

def recent 
    @agreements = Agreement.recent.where("accepted = ?", false).all.paginate(:page => params[:page], :per_page => 20) 
    render action: :index 
end 

def oldest 
    @agreements = Agreement.oldest.where("accepted = ?", false).all.paginate(:page => params[:page], :per_page => 20) 
    render action: :index 
end 

def recentduedate 
    @agreements = Agreement.recentduedate.where("accepted = ?", false).all.paginate(:page => params[:page], :per_page => 20) 
    render action: :index 
end 

def oldestduedate 
    @agreements = Agreement.oldestduedate.where("accepted = ?", false).all.paginate(:page => params[:page], :per_page => 20) 
    render action: :index 
end 

def collegeessay 
    @agreements = Agreement.collegeessay.where("accepted = ?", false).all.paginate(:page => params[:page], :per_page => 20) 
    render action: :index 
end 

def resume 
    @agreements = Agreement.resume.where("accepted = ?", false).paginate(:page => params[:page], :per_page => 20) 
    render action: :index 
end 

def languagetranslation 
    @agreements = Agreement.languagetranslation.where("accepted = ?", false).all.paginate(:page => params[:page], :per_page => 20) 
    render action: :index 
end 

def collegeapplication 
    @agreements = Agreement.collegeapplication.where("accepted = ?", false).all.paginate(:page => params[:page], :per_page => 20) 
    render action: :index 
end 

def businesspaper 
    @agreements = Agreement.businesspaper.where("accepted = ?", false).all.paginate(:page => params[:page], :per_page => 20) 
    render action: :index 
end 

def scholarshipessay 
    @agreements = Agreement.scholarshipessay.where("accepted = ?", false).all.paginate(:page => params[:page], :per_page => 20) 
    render action: :index 
end 

def highschoolessay 
     @agreements = Agreement.highschoolessay.where("accepted = ?", false).all.paginate(:page => params[:page], :per_page => 20) 
     render action: :index 
    end 



def title 
    @agreements = Agreement.title.where("accepted = ?", false).all.paginate(:page => params[:page], :per_page => 20) 
    render action: :index 
end 

def lowestprice 
    @agreements = Agreement.lowestprice.where("accepted = ?", false).all.paginate(:page => params[:page], :per_page => 20) 
    render action: :index 
end 

def highestprice 
    @agreements = Agreement.highestprice.where("accepted = ?", false).all.paginate(:page => params[:page], :per_page => 20) 
    render action: :index 
end 

Bisher habe ich das gemacht und es funktioniert alles einzeln, aber ich möchte, dass die Filterergebnisse auf der Grundlage, was writing_type als primäres Ergebnis ausgewählt wird. Vielen Dank!!!

Antwort

1

Erstens, möglicherweise Abfrageparameter anstelle einzelner Pfad/Aktionen verwenden, da sie alle dasselbe unter Verwendung verschiedener Bedingungen tun. Dies wird den Code erheblich vereinfachen.

Ansicht

<%= link_to "Resumes", agreements_path(writing_type: 'Resume', price_asc: true) %> 
<%= link_to "Business Papers Cheapest First", agreements_path(writing_type: 'Business Papers', price_asc: true) %> 
<%= link_to "Business Papers ", agreements_path(writing_type: 'Business Papers', price_desc: true) %> 

Die erste link_to wird oben geworden "http://localhost:3000/agreements?writing_type=resume&price_asc=true"

Dann können Sie diese in der Steuerung tun:

def index 
    @agreements = Agreement.where(accepted: false).where(params[:writing_type]).order(sorting) 
end 

private 
    def sorting 
    sort = [] # there is probably a smarter way to do this 
    sort << 'price ASC' if params.has_key? :price_asc 
    sort << 'price DESC' if params.has_key? :price_desc 
    sort << 'duedate ASC' if params.has_key? :duedate_asc 
    sort << 'duedate DESC' if params.has_key? :duedate_desc 
    sort.join ', ' 
    end 

Dann, wenn Sie mehrere Auswahlmöglichkeiten benötigen, können Sie kann ein reguläres Formular oder Javascript verwenden, um die Abfrage aufzubauen und zu übermitteln.

+0

Das alles macht für mich Sinn, danke! Ich werde implementieren, wenn ich zurückkomme, um sicherzustellen, dass es funktioniert! –