在ActiveRecord中转义使用预准备语句的字符串是不可能的

时间:2013-08-06 09:20:53

标签: sql ruby-on-rails ruby activerecord

我正在编写一个复杂的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)

2 个答案:

答案 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)