2011-01-02 10 views
0

Ich bin mir bewusst, dass ich Anfragen durch den Aufruf where() auf einem Modell wie folgt suchen: Post.where(:title => 'My First Post')Wie führe ich eine Suche in Rails3 durch?

Was aber, wenn ich weiß nicht, ob der Benutzer die Suchparameter herausfiltern will? Zum Beispiel habe ich ein Suchformular mit einem optionalen title Feld. Wenn der Titel ausgefüllt ist, sollte das Formular nach einem Titel suchen. Wenn dies nicht der Fall ist, sollte das Formular nur alle Felder zurückgeben.

Ich habe versucht, etwas entlang der Linien von

tun
search = Post.all 
if params[:title].present? 
    search.where(:title => params[:title]) 
end 

jedoch Rails immidiately gibt das Ergebnis der Suche, wenn ich Post.All anrufen und ich kann nicht weitere Bedingungen hinzufügen/

Wie kann ich tun Dies?

Danke!

Antwort

1

.all ist eine Finisher-Methode für arel und bewirkt, dass die Abfrage tatsächlich aufgerufen wird (dasselbe gilt für .each und .first). Also, wenn Sie in der Lage sein wollen, den Umfang bedingt aufzubauen, sollte .all das letzte Ding genannt werden, wenn Sie es überhaupt anrufen wollen.

+0

Wie würde ich dann die Ressource bekommen, ohne die Felder abzurufen, damit ich weiter Bedingungen aufrufen kann? Vielen Dank! –

+0

Eine Option besteht darin, 'search = Post.unscoped' oder' search = Post.scoped' zu setzen, wodurch Sie eine arel-Relation erhalten, mit der Sie spielen können. Alternativ können Sie die Art und Weise, in der Sie bereichsabhängig neue Bereiche hinzufügen, überdenken und versuchen, sich im Modell besser damit zu befassen. – idlefingers

1

Da es wirklich in der Art und Weise der Beziehungen zu Kette hier nicht viel, so scheint es, dass ein einfacher Einzeiler mit einem ternären Operator tun könnte:

@posts = params[:title].present? ? Post.where(:title => params[:title]) : Post.all 

... weil, wenn es ist nein: where clause scope, du könntest es später nicht mehr ketten: alle sowieso.

+0

Richtig, aber das war nur ein Beispiel. Stellen Sie sich vor, ich müsste hier möglicherweise 5 verschiedene Bedingungen aufrufen, abhängig von der Benutzereingabe. Wie würde ich eine Ressource erhalten, ohne '.all' zu nennen, damit ich weiter Bedingungen anrufen kann? Vielen Dank! –

+0

Okay. Sie könnten also mit post_query = Post.scoped beginnen und dann auf diesem Basisbereich aufbauen, z. post_query = post_query.where (: title => params [: title]) usw. – Scott

Verwandte Themen