我正在编写一个复杂的ActiveRecord查询,它在过滤函数的管道中传递ActivRecord :: Relation。其中一个必须添加一系列“OR”链接条件。由于ActiveRecord :: Relation不提供#or方法,我正在编写一个SQL字符串以传入#where。 这个字符串是动态生成的,所以我不能真正使用?对于价值观。我从之前的问题中得知,使用预准备语句是创建查询的最佳实践方法,但我找不到在此处应用它的方法。
有没有办法逃避字符串,或转换为使用预准备语句?
编辑:我正在做这样的事情(该方法接收项目作为ActiveRecord :: Relation对象。
where_string = '';
filters.each do |field,value|
if(Item.column_names.include? field)
where_string += "OR" if where_string!=''
where_string += " #{field} LIKE '%#{value.to_s}%'"
end
return items.where(where_string)
答案 0 :(得分:1)
尝试使用以下
query_array = []
value_array = []
filters.each do |field,value|
if(Item.column_names.include? field)
query_array << "#{field} LIKE ?"
value_array << "%#{value.to_s}%"
end
end
value_array.insert(0, query_array.join(' OR '))
return Item.where(value_array)
答案 1 :(得分:1)
我将如何做到这一点:
def filters_to_query(filters)
filters.inject(['']) do |query, field, value|
if Item.column_names.includes? field
query[0] << ' OR ' unless query[0].blank?
query[0] << "#{field} LIKE ?"
query << value
end
end
end
Item.where(filters_to_query filters)