Ruby on rails 铁路";其中;语句:如何忽略空白参数

Ruby on rails 铁路";其中;语句:如何忽略空白参数,ruby-on-rails,where,params,ignore,Ruby On Rails,Where,Params,Ignore,我对Rails非常陌生,我有一种感觉,我从一个错误的角度来处理这个问题,但现在它开始了。。。我有一个显示车辆的列表页面,我正在尝试添加过滤功能,用户可以根据车辆大小、制造商和/或付款选项过滤结果 使用三个选择表单字段,用户可以设置:vehicle\u size、:manufacturer和/或:payment\u options参数的值,并将这些值提交给我使用 @vehicles = Vehicle.order("vehicles.id ASC").where(:visible => tr

我对Rails非常陌生,我有一种感觉,我从一个错误的角度来处理这个问题,但现在它开始了。。。我有一个显示车辆的列表页面,我正在尝试添加过滤功能,用户可以根据车辆大小、制造商和/或付款选项过滤结果

使用三个选择表单字段,用户可以设置:vehicle\u size、:manufacturer和/或:payment\u options参数的值,并将这些值提交给我使用

@vehicles = Vehicle.order("vehicles.id ASC").where(:visible => true, :vehicle_size => params[:vehicle_size] )
这是一种疑问。这适用于单个参数(以上返回正确车辆尺寸的结果),但如果其中一个参数留空,我希望能够传入所有3个参数而不获得任何结果

有没有一种方法可以在不经过编写if语句的过程的情况下实现这一点?if语句根据设置的参数定义不同的where语句?如果我添加更多的过滤器选项,这可能会变得非常乏味。。也许某种内联if具有以下效果的关键解决方案:

@vehicles = Vehicle.order("vehicles.id ASC").where(:visible => true, if(params.has_key?(:vehicle_size):vehicle_size => params[:vehicle_size], end if(params.has_key?(:manufacturer):manufacturer => params[:manufacturer] end )
对于N00b问题,我深表歉意,并提前表示感谢。

您可以:

@vehicles = Vehicle.order('vehicles.id ASC')
if params[:vehicle_size].present?
  @vehicles = @vehicles.where(vehicle_size: params[:vehicle_size])
end
或者,您可以在模型中创建范围:

scope :vehicle_size, ->(vehicle_size) { where(vehicle_size: vehicle_size) if vehicle_size.present? }
或者,根据答案,您可以创建类方法:

def self.vehicle_size(vehicle_size)
  if vehicle_size.present?
    where(vehicle_size: vehicle_size)
  else
    scoped # `all` if you use Rails 4
  end
end
在控制器中调用scope和class方法,例如:

@vehicles = Vehicle.order('vehicles.id ASC').vehicle_size(params[:vehicle_size])
您可以分别对其余参数执行相同的操作

您可以执行以下操作:

@vehicles = Vehicle.order('vehicles.id ASC')
if params[:vehicle_size].present?
  @vehicles = @vehicles.where(vehicle_size: params[:vehicle_size])
end
或者,您可以在模型中创建范围:

scope :vehicle_size, ->(vehicle_size) { where(vehicle_size: vehicle_size) if vehicle_size.present? }
或者,根据答案,您可以创建类方法:

def self.vehicle_size(vehicle_size)
  if vehicle_size.present?
    where(vehicle_size: vehicle_size)
  else
    scoped # `all` if you use Rails 4
  end
end
在控制器中调用scope和class方法,例如:

@vehicles = Vehicle.order('vehicles.id ASC').vehicle_size(params[:vehicle_size])

您可以分别对其余参数执行相同的操作

将作用域方法应用于搜索查询,默认情况下,当参数为空时将忽略,可能值得检查将作用域方法应用于搜索查询,默认情况下,当参数为空时将忽略,可能值得检查一下

Ahh-因此您设置@vehicles,然后为每个存在的过滤器?输入where语句?。。我曾设想在一行中完成这一切,但效果很好-多亏了很多-所以你设置了@vehicles,然后为每个存在的过滤器通过where语句?。。我曾设想在一行中完成这一切,但效果很好-非常感谢