rails“where”声明:如何忽略空白参数

时间:2013-08-12 10:41:43

标签: ruby-on-rails where params ignore

我是Rails的新手,我有一种感觉,我正在从错误的角度接近这个但是这里......我有一个列表页面显示车辆,我正在尝试添加过滤器功能,用户可以通过vehicle_size,manufacturer和/或payment_options过滤结果。

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

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

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

有没有办法在不经过编写过程的情况下执行此操作if语句定义不同的where语句,具体取决于params的设置?如果我添加更多的过滤器选项,这可能变得非常繁琐。如果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 )

对N00b问题表示歉心,并提前致谢。

2 个答案:

答案 0 :(得分:7)

你可以这样做:

@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? }

或者,根据this回答,您可以创建类方法:

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])

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

答案 1 :(得分:0)

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