2012-11-08 5 views
11

Ich habe mein Gehirn über dieses Problem, aber nicht bekommen. Ich fühle mich wie die Antwort wohl offensichtlich istEinstellung der Standard-Suchparameter auf Ransack für Schienen

Was ich versuche, Folgendes zu tun ist:

Ich habe einen Index-Controller, die eine Reihe von Jobs aufgeführt, die ich suche Ransack verwenden. Jeder Job hat ein Abschlussdatum, das entweder ein Datum enthält oder Null ist (nicht abgeschlossen). Derzeit funktioniert die Suche selbst sehr gut. Ich möchte es so machen, dass die Indexseite nur die unvollendete Arbeit anzeigt, aber ich möchte auch, dass sie funktioniert, so dass, wenn jemand eine Suche ausführt, Ergebnisse sowohl für fertige als auch für noch nicht abgeschlossene Arbeit zurückgegeben werden.

Jede Hilfe würde sehr geschätzt werden. Im folgenden Code: Ist der Name des Felds mit dem Abschlussdatum. Ich habe mich auch im Internet umgeschaut und dachte, dass vielleicht etwas wie das DEFAULT_SEARCH_PARAMETER = {}, das ich im Job-Modell habe, funktionieren könnte, aber ich konnte es anscheinend nicht bekommen.

class Job < ActiveRecord::Base 
    DEFAULT_SEARCH_PARAMETER ={} 
    attr_accessible :items_attributes, :actual 
end 

def index 
    @search = Job.search(params[:q] || Job::DEFAULT_SEARCH_PARAMETER) 
    @search.build_condition 
    @results = @search.result 
    @job = @results.paginate(:per_page => 10, :page => params[:page]) 
end 

Antwort

18

Ich glaube, Sie nur Ihre eigenen Filter anwenden könnten, wenn die Suchparameter existieren nicht:

def index 
    @search = Job.search(params[:q]) 
    @results = @search.result 
    @results = @results.where(:your_date => nil) unless params[:q] 
    @job = @results.paginate(:per_page => 10, :page => params[:page]) 
end 
+2

Danke! Das hat funktioniert. Ich würde das abstimmen, aber ich habe nicht den Ruf. –

+0

Überprüfen Sie Ricsrock die bessere Antwort, bevor Sie diesem folgen. –

0

Standardmäßig möchten Sie, dass die Seite mit Datensätzen geladen wird, in denen "Ist" gleich Null ist. Und später, wenn der Benutzer sucht, möchten Sie zurückgehen, wie Ihre Suche zuvor funktioniert hat.

Probieren Sie es aus.

def index 
    @search = Job.search(params[:q] || Job::DEFAULT_SEARCH_PARAMETER) 
    @search.build_condition 
    @results = @search.result 
    if @results.nil? 
     @results=Job.find(:all, :conditions => ["actual = NULL"]) 
    end 

    @job = @results.paginate(:per_page => 10, :page => params[:page]) 
end  
+0

Ich habe dies versucht, aber es hat nicht funktioniert. Danke für die Hilfe! –

27

spät zur Party, aber dachte, ich würde einen alternativen Ansatz, falls jemand anderes vorschlagen kommt darauf an.

Die obige Antwort funktioniert, aber ihr Nachteil besteht darin, dass der Standard dem Suchobjekt von Ransack nicht hinzugefügt wird. Wenn Sie also ein Suchformular verwenden, wird die Standardauswahl nicht im Formular angezeigt.

Der folgende Ansatz fügt dem Suchobjekt den Standardwert hinzu und wird daher in Ihrem Suchformular angezeigt.

def index 
    @search = Job.search(params[:q]) 
    @search.status_cont = 'Open' unless params[:q] #or whatever, must use Ransack's predicates here 
    @results = @search.result 
    @job = @results.paginate(:per_page => 10, :page => params[:page]) 
end 
+0

Dies sollte die akzeptierte Antwort sein. – johnrees

+0

Hey @ricsrock irgendwelche Ideen, wie Sie dies mit einem Whitelist-Bereich tun? – bnussey

+0

Schöne Antwort @ricsrock. Da die Ransack-Suche geändert wird, wird der von Ihnen hinzugefügte Standard einfach in einem Suchabschnitt der gerenderten Seite angezeigt. –

Verwandte Themen