1

我对 Rails 很陌生,我感觉我从错误的角度接近这个问题,但它就在这里......我有一个显示车辆的列表页面,我正在尝试添加过滤功能,用户可以在其中过滤结果按车辆尺寸、制造商和/或付款选项。

使用三个选择表单字段,用户可以设置 :vehicle_size、:manufacturer 和/或 :payment_options 参数的值,并将这些值提交给我正在使用的控制器

@vehicles = Vehicle.order("vehicles.id ASC").where(:visible => true, :vehicle_size => params[:vehicle_size] )
  

一种查询。这适用于单个参数(上面返回正确车辆尺寸的结果)但是如果参数之一留空,我希望能够传入所有 3 个参数而不会得到任何结果。

有没有一种方法可以做到这一点,而无需通过编写 if 语句来定义不同的 where 语句,具体取决于设置的参数?如果我添加更多过滤器选项,这可能会变得非常乏味。如果 has_key 解决方案可能会产生某种内联的效果:

@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 )
4

2 回答 2

8

你可以做:

@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

您可以在控制器中同时调用范围和类方法,例如:

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

你可以分别对剩余的参数做同样的事情。

于 2013-08-12T10:51:24.737 回答
0

has_scope gem将范围方法应用于您的搜索查询,默认情况下,当参数为空时它会忽略,这可能值得检查

于 2016-03-28T20:07:30.427 回答