2017-11-06 9 views
0

これは、複数のパラメータクエリに対応できるインデックスメソッドを作成する最善の方法ですか?Rails 5:多くのパラメータがある場合

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 

私の方法では、2つの場合にパラメータをキャッチしていないようです。

+0

ヒント:Fooバーの質問 – sawa

答えて

6

私はActionController::Parameters#sliceを使用します。

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

あなたのコードの問題:あなたは:user_id:statusキーを持っている場合は、両方が存在チェックをparamsは含めて、他のすべてのロジックをスキップしています。両方のパラメータをチェックする(条件#3)。

+0

ああ私の神、_thank you_。条件付きの順序。もちろん。 –

+0

@ CD-RUM、あなたは大歓迎です – Ilya

0

あなたが複数の条件を持っている場合、これはあなた

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 

のために動作しますが、あなたがアプローチの下に使用できるパラメータに基づいて、クエリに追加する必要があります。 SQLインジェクションに注意してください。

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 
関連する問題