我有一个DataPoint模型和一个表单,允许用户输入他们想要查看的数据点的年龄范围和收入范围。
在data_points_controller.rb中:
4
11
20
5
在模型data_point.rb中:
def result
@data_points = DataPoint.select_subset(params[:min_income], params[:max_income], params[:min_age], params[:max_age])
end
当用户输入所有4个输入时,这可以正常工作:min_income,max_income,min_age和max_age。使用摘要统计信息返回正确的数据子集。
但是,当用户将4个输入中的任何一个留空时,我收到错误:
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
当用户省略特定参数时,我希望查询能够像对该特定参数没有约束一样运行。
我看了一下数据库,发现没有一个年龄在0-100之外,所以我试过了:
Computation results to 'NaN'(Not a Number)
但我仍然遇到上述错误。
即使用户没有填写所有4个表单字段,我是如何才能正常工作的?
谢谢!
答案 0 :(得分:0)
||=
设置变量的值,如果其值为“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
blank?
将涵盖nil
和""
。
答案 1 :(得分:0)
不确定是否存在所有传递的属性,您可以重写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
请注意,当用户没有选择任何限制时,您应该处理这种情况。