Ruby on rails 检查可选参数的存在性

Ruby on rails 检查可选参数的存在性,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有三个可选参数param1,param2和param3。用户可以通过任意组合传递任意数量的密码 如果三个都通过了,我可以检查param键是否存在,如下所示: def index return unless params.key?(:param1) && params.key?(:param2) && params.key?(:param3) @test = Model.where(param1: params[:param1],

我有三个可选参数
param1
param2
param3
。用户可以通过任意组合传递任意数量的密码

如果三个都通过了,我可以检查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
或可以传递两次相同的参数,例如:

http://localhost:1000/orders?param1[]=abc&param1[]=
(传递相同参数1的abc和空白值)

[“abc”,“”],“格式”=>:json,“控制器”=>“命令”,“操作”=>“索引”,“命令”=>{}允许:false>
有没有更好的方法来检查这些参数的存在,这样我就不必重复相同的代码了?

为什么不这样做呢

def index
  @test = params.empty? ? Model.none : Model.where(params)
end
试着跟随

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

如果要求是:

  • 仅处理名为
    param1
    param2
    param3
    的参数
  • 即使使用同一个键传递多个值,也只处理第一个值
这可能有用

conditions=params.select{k|
[:param1,:param2,:param3]。包括?k
}.map{k,v|
[k,数组(v)[0]]
}.to_h
型号。其中(**条件)

谢谢。我试过了,但没有成功。请检查更新的问题,你正在尝试做的不会真正发挥好。根据您更新的问题,一个参数可以传递两次,这一事实会导致一个指向数组的散列键,您无法使用ActiveRecord
where
查询选择干净地调用该散列键。在SQL中思考一下:您将如何编写{:param1=>[“first”,“second”]}
其中param1='first'和param1='second'没有任何意义。
我正在使用CGI.parse解析参数,以便能够获得两次传递的相同参数的结果。您的代码工作正常吗?我认为
return除非参数key(:param1)和¶ms.key(:param1)和¶ms.key(:param1)
应该是
return除非参数key(:param1)| params.key(:param2)| params.key(:param3)
如果所有3个参数都被传递了,那么这只是一种情况,where子句基于传递的内容。我认为在每种情况下都有一个拼写错误
param1
,假设它应该是
param2
&
param2
,但是在您的代码中,即使
param1¶m2存在,但param3不存在,它也会返回。谢谢更新。谢谢你的回复。在
Model.where(params)
def index
  par = params.slice(:param1, :param2, :param3).delete_if { |k, v| v.blank? }
  return if par.blank?
  Model.where(par)
end