Ruby on rails 当用户将表单字段留空时,为Rails 4中的参数设置默认值

Ruby on rails 当用户将表单字段留空时,为Rails 4中的参数设置默认值,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个数据点模型和一个表单,允许用户输入他们想要查看的数据点的年龄范围和收入范围 在data_points_controller.rb中: def result @data_points = DataPoint.select_subset(params[:min_income], params[:max_income], params[:min_age], params[:max_age]) end 在模型数据_point.rb中: def self.select_subset(mi

我有一个数据点模型和一个表单,允许用户输入他们想要查看的数据点的年龄范围和收入范围

在data_points_controller.rb中:

def result
    @data_points = DataPoint.select_subset(params[:min_income], params[:max_income], params[:min_age], params[:max_age])
end
在模型数据_point.rb中:

def self.select_subset(min_income, max_income, min_age, max_age)
    DataPoint.where("annual_income BETWEEN :min_income AND :max_income AND age BETWEEN :min_age AND :max_age", {min_income: min_income, max_income: max_income, min_age: min_age, max_age: max_age})
end
当用户输入全部4个输入时,此功能正常工作:min_收入、max_收入、min_年龄和max_年龄。返回正确的数据子集和摘要统计信息

但是,当用户将4个输入中的任何一个留空时,我得到一个错误:

Computation results to 'NaN'(Not a Number)
当用户省略某个特定参数时,我希望查询能够像对该特定参数没有约束一样运行

我查看了数据库,发现没有一个年龄超过0-100岁,因此我尝试:

def result
    params[:min_age] ||= "0"
    params[:max_age] ||= "100"
    @data_points = DataPoint.select_subset(params[:min_income], params[:max_income], params[:min_age], params[:max_age])
end
但我仍然得到上述错误

即使用户没有填写全部4个表单字段,我也能正确地完成这项工作吗

谢谢

| |=
如果变量的值为“Nothing”(Ruby中的
false
nil

但是,如果参数为空(
”),它将保持为空

a = ""
#=> ""
a ||= "foo"
#=> ""
因此,请尝试以下方法:

def result
  params[:min_age] = "0"   if params[:min_age].blank?
  params[:max_age] = "100" if params[:max_age].blank?
  @data_points = DataPoint.select_subset(params[:min_income], params[:max_income], params[:min_age], params[:max_age])
end

将涵盖
nil

由于不确定是否存在所有传递的属性,您可以重写SQL查询,以仅包括那些具有来自用户的值的限制:

def self.select_subset(min_income, max_income, min_age, max_age)
  conditions = [].tap do |array|
    array << "annual_income >= :min_income" if min_income.present?
    array << "annual_income <= :max_income" if max_income.present?
    array << "age >= :min_age" if min_age.present?
    array << "age <= :max_age" if max_age.present?
  end

  named_params = {min_income: min_income, max_income: max_income, min_age: min_age, max_age: max_age}
  DataPoint.where(conditions.join(' AND '), named_params)
end
def self.选择_子集(最小收入、最大收入、最小年龄、最大年龄)
条件=[]点击do |数组|

数组,那么为什么不为
minu-income
max-income
参数设置默认值呢?