2017-11-20 12 views
0

私は3つのオプションパラメータparam1,param2およびparam3を持っています。ユーザーは任意の組み合わせで任意の数を渡すことができます。オプションパラメータの存在の確認

3つのすべてが渡された場合のparamキーは以下のように存在している場合、私は確認することができます。

def index 
    return unless params.key?(:param1) && params.key?(:param2) && params.key?(:param3) 
    @test = Model.where(param1: params[:param1], 
         param2: params[:param2], 
         param3: params[:param3]) 
    end 

しかし、私は唯一のparam1が渡されたりした場合などの他の条件のために同じコードを繰り返す必要はありませんparam1そしてparam2は、例えばを渡されたり、同じparamが二回渡すことができます。

http://localhost:1000/orders?param1[]=abc&param1[]= 

(ABCと同じのparam1のためのブランク値を渡します)
<ActionController::Parameters {"pram1"=>["abc", ""], "format"=>:json, "controller"=>"orders", "action"=>"index", "order"=>{}} permitted: false> 

これらのパラメータの存在を確認するより良い方法がありますので、私は同じコードを繰り返す必要はありませんか?

+0

コードは正常ですか?私は 'params.key?(:param1)&& params.key?(:param1)&& params.key?(:param1)'は、 '' params.key? params.key?(:param2)|| params.key?(:param3) ' – Salil

+0

3つのパラメータがすべて渡され、where句が渡されたものに基づいている場合は、まあまあです。 – mike

+0

'param2'と' param2'であると仮定した場合、それぞれ 'param1'のタイプミスがありますが、' param1とparam2は存在しますがparam3は存在しません。 'というコードでも戻ります – Salil

答えて

0

どうしてこのようにしないのですか?

def index 
    @test = params.empty? ? Model.none : Model.where(params) 
end 
+0

ありがとうございます。私はそれを試みたが、運がない。更新された質問 – mike

+0

を確認してください。あなたがやっていることは本当にうまくいかないでしょう。あなたの更新された質問に基づいて、単一のパラメータが2回渡されるという事実は配列を指し示すハッシュキーをもたらします。これはActiveRecordの 'where'クエリー選択ではきれいに呼び出すことができません。それをSQLで考えてみてください。{:param1 => ["first"、 "second"]}と書くとどうでしょうか? 'where param1 = 'first' AND param1 = 'second''は意味をなさない。 – Orlando

+0

私はCGI.parseでparamsを解析していますので、同じparamを2回渡して結果を得ることができます – mike

0

の要件がある場合は

def index 
    par = params.slice(:param1, :param2, :param3).delete_if { |k, v| v.blank? } 
    return if par.blank? 
    Model.where(par) 
end 
+0

あなたの返事をありがとう。 'Model.where(params)'で 'ActiveModel :: ForbiddenAttributesError'を取得する – mike

+0

私の編集した答えをチェックしてください。 – Salil

1

を、次の試してみてください。

  • param1param2またはparam3という名前のパラメータのみを処理します。
  • 複数の値が同じキーで渡されても、最初の値のみを処理します。

これは機能する場合があります。

conditions = params.select {|k| 
    [:param1, :param2, :param3].include? k 
}.map {|k, v| 
    [k, Array(v)[0]] 
}.to_h 
Model.where(**conditions) 
関連する問題