2017-11-06 5 views
0

Ist dies der beste Weg, eine Indexmethode zu schreiben, die mehrere Param-Abfragen aufnehmen kann?Rails 5: Wenn viele Parameter

if params.key?(:user_id) 
    Post.where(user_id: params[:user_id]) 
elsif params.key?(:status) 
    Post.where(status: params[:status]) 
elsif params.key?(:user_id) && params.key?(:status) 
    Post.where(user_id: params[:user_id], status: params[:status]) 
else 
    Post.all 
end 

Meine Methode scheint nicht die params zu fangen, wenn es zwei sind.

+0

Hinweis: Foo Bar Frage – sawa

Antwort

6

würde ich ActionController::Parameters#slice verwenden:

post_parmas = params.slice(:user_id, :status) 
post_params.empty? ? Post.all : Post.where(post_params) 

Ihr Code Problem: Wenn Sie :user_id oder :status Schlüssel haben, können Sie alle anderen Logik-Skipping, einschließlich Anwesenheitskontrolle params. Das Überprüfen beider Parameter (Bedingung # 3) sollte zuerst erfolgen.

+0

Oh mein Gott, _thank you_. Die bedingte Reihenfolge. Na sicher. –

+0

@ CD-RUM, Sie sind willkommen – Ilya

0

Dies wird für die Arbeit Sie

if params.key?(:user_id) && params.key?(:status) 
    Post.where(user_id: params[:user_id], status: params[:status]) 
elsif params.key?(:user_id) 
    Post.where(user_id: params[:user_id]) 
elsif params.key?(:status) 
    Post.where(status: params[:status]) 
else 
    Post.all 
end 

Wenn Sie mehrere Bedingungen in Abfrage basierend auf Parametern müssen hinzugefügt werden, können Sie unter Ansatz nutzen können. Bitte achten Sie auf SQL-Injektion.

condition = "" 
if(params[:user_id].blank? and params[:user_id].blank?) 
    Post.all 
else 
    condition += "user_id=#{params[:user_id]}" if params.key?(:user_id) 
    condition += " AND status=#{params[:status]}" if params.key?(:status) 
    Post.where("#{condition}") 
end 
Verwandte Themen