Noz*_*Noz 0 arrays dynamic ruby-on-rails-3
我有一个表,用户可以使用许多不同类型的组合以各种方式进行过滤.有了我从用户那里得到的所有输入数据,我从SQL中逃脱用户数据非常重要,这导致了我现在遇到的问题.我有两个基于发送到动作的参数动态构建的数组,一个数组包含SQL子句,另一个数组包含要与其相应的caluse配对的值......例如......
def results
sql_clauses = Array.new
sql_args = Array.new
unless params[:elapsed_time].nil?
sql_clauses << "elapsed_time = ?"
sql_args << params[:elaped_time]
end
unless params[:age_greater_than].nil?
sql_clauses << "age > ?"
sql_args << params[:age_greater_than]
end
.....
@results = Model.where(sql_clauses.join(" and "), sql_args.join(", "))
end
Run Code Online (Sandbox Code Playgroud)
现在这将sql_clauses数组发送到where方法没问题.但它在第二个参数上爆炸,因为它返回一个字符串,并且它期望各个变量与每个"?"相对应.出现在sql_clauses数组中的字段.我已经尝试过KandadaBoggu提供的关于Comine条件数组的解决方案.这两个选项都不适合我,但可能是因为我使用2个数组而不是1个.
有人知道我的问题的解决方案吗?
没有必要使用字符串在Rails 3中构建动态查询.ActiveRecord方法(如select,where,order,limit等)返回ActiveRecord :: Relation对象,这些对象可以在不触发多个数据库调用的情况下链接:
cars = Car.where(:colour => 'black') # No database queries are generated here.
rich_ppls_cars = cars.order('cars.price DESC').limit(10) # Still no db queries.
Run Code Online (Sandbox Code Playgroud)
当我们调用数据库将被查询.all,.first,.last,或.each在一个ActiveRecord :: Relation对象.
示例代码
假设您正在使用以下列查询模型:
你有一个params哈希,看起来像这样:
{ :elapsed_time => 34, :age_greater_than => 14, :max_rows => 20 }
Run Code Online (Sandbox Code Playgroud)
您的控制器操作可能如下所示:
def results
query = ModelName.select([:name, :elapsed_time, :age])
query = query.where(:elapsed_time => params[:elapsed_time]) if params[:elapsed_time].present?
query = query.where('age > ?', params[:age_greater_than]) if params[:age_greater_then].present?
query = query.limit(params[:max_rows]) if params[:max_rows].present?
@dynamic_query = query
end
Run Code Online (Sandbox Code Playgroud)
请注意,我正在测试是否存在params键.present?.这可以防止我们将params散列中的空字符串误解为有效数据.
参考资料