2014-06-06 5 views
0

다음 질문에 대한 답변을 how can I use like query in ruby with sinatra? 다음과 같은 문제점이 있습니다. 입력 문자열에서 쿼리를 작성하는 방법은 av (alue)와 ak (EY) (= 필드) 다양한 selctions는 selection.join(' and ')activerecord를 사용하여 SQL injection 방지

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

당신이 어떤 이유로 당신의 string_selector 기능을 지원해야하는 경우, 그러나 ... 당신은 액티브를 사용하는 경우 무엇을하려고 할 수있는 더 좋은 방법이있을거야, 나는 적어도 Arel을 사용합니다 :

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하지만 Arel 테이블에서 일치 항목을 사용하면 " (NoMethodError)"에 대해 "정의되지 않은 메서드가 '일치하는 오류가 발생합니다. 활성 레코드 해시 및 메서드를 사용하여 쿼리를 작성했지만 실패했습니다. , 거기에 여러 조건을 여러 테이블에 내가 일반 SQL을 사용하여 결합해야합니다. 나는 SQL을 사용함으로써 더 이상 책의 글자를 따르는 주사를 막을 수는 없지만 LIKE 주입을 사용하면 주사가 작동하지 않는다는 것을 알아 냈으므로 여분의 보호 장치없이 계속해야 할 것입니다. afreid – peter

+0

Arel :: Table에'matches'를 호출 할 수 없으므로 Arel 속성에서 호출해야합니다. 예제에서'tbl [k]'는 정의 된'Arel :: Table''tbl'에'k'에 대한'Arel :: Attribute'입니다. –

+0

아아, 미안하지만,이 작은 테스트에서, 나는 그것을 나의 쿼리 디자인에 통합하려고 노력할 것이다. – peter