2014-06-06 66 views
0

关于how can I use like query in ruby with sinatra?问题的下列问题,我有以下问题从注入保护我的sql。这里是我的方法来从类型字符串进行查询,它接收av(alue)搜索和ak EY)(=字段)来去看你。 ,各种selctions被selection.join(' and ')使用activerecord防止sql注入

def string_selector(k, v) 
    case 
    when v[/\|/] 
    v.scan(/([^\|]+)(\|)([^\|]+)/).map {|p| "lower(#{k}) LIKE '%#{p.first.downcase}%' or lower(#{k}) LIKE '%#{p.last.downcase}%'"} 
    when v[/[<>=]/] 
    v.scan(/(<=?|>=?|=)([^<>=]+)/).map { |part| p part; "#{k} #{part.first} '#{part.last.strip}'"} 
    else 
    # "lower(#{k}) LIKE '%#{v.downcase}%'" #(works) 
    ("lower(#{k}) LIKE ?", '%#{v.downcase}%') #doesn't work 
    end 
end 

加盟之后,但我得到的错误

selectors.rb:38: syntax error, unexpected keyword_end, expecting $end 
from C:/../1.9.1/rubygems/core_ext/kernel_require.rb:55:in `require' 

什么可能我是做错了什么?

回答

1

我们有了一个更好的方式做你正在尝试,如果你正在使用的ActiveRecord做......但是,如果你需要支持你因为某些原因string_selector功能,我至少会使用阿雷尔:

def string_selector(k, v) 
    tbl = Arel::Table.new(:test) # your table, or you could pass this in... 
    condition = case v 
    when /\|/ 
    vals = v.split(/\|/) 
    first = vals.shift 
    vals.inject(tbl[k].matches("%#{first.strip}%")) do |acc, val| 
     acc.or(tbl[k].matches("%#{val.strip}%")) 
    end 
    when /<>/ 
    tbl[k].not_eq(v.gsub(/<>/, '').strip) 
    when /\=/ 
    tbl[k].eq(v.gsub(/\=/, '').strip) 
    else 
    tbl[k].matches(v.strip) 
    end 
    tbl.where(condition).to_sql 
end 

请注意,matches将为您执行不区分大小写的查询(例如,在PostgreSQL中使用ILIKE)。

+0

thnx kardeiz但我得到错误“未定义的方法匹配”为#(NoMethodError)“当我使用Arel表上的匹配时,我尝试使用activerecord哈希和方法进行查询,但失败,有很多条件可以在多个表上进行组合,所以我使用普通的sql。我害怕通过使用sql我不能防止注入本书的信件后,但已经发现,通过使用LIKE注入也不工作,所以我将不得不继续进行,恐怕 – peter

+0

你不能在'Arel :: Table'上调用'matches',它需要在Arel属性上调用。在我的例子中,'tbl [k]'是定义的'Arel :: Table'' tbl'上''的'Arel :: Attribute'。 –

+0

啊我看到了,对不起,在一个小测试中,我会尝试将它集成到我的查询设计中 – peter