2009-07-17 10 views
2

簡単な検索を作成する必要がありますが、私はSphinxを使用する余裕がありません。カスタム条件でSQLを消化する


keywords = input.split(/\s+/) 
queries = [] 

keywords.each do |keyword| 
    queries << sanitize_sql_for_conditions(
       "(classifications.species LIKE '%#{keyword}%' OR 
       classifications.family LIKE '%#{keyword}%' OR 
       classifications.trivial_names LIKE '%#{keyword}%' OR 
       place LIKE '%#{keyword}%')") 
end 

options[:conditions] = queries.join(' AND ') 

さて、sanitize_sql_for_conditionsが動作しない:ここで

は、私が書いたものです!それは単に元の文字列を返します。

このコードを書き換えて悪意のあるコードから逃れることはできますか?

+1

あなたはスフィンクスを使用する余裕がないということを意味しますか?それは無料です! –

答えて

9

"#{keyword}"を "?"に置き換えた場合、このようなことができます。疑問符を使用すると、自動的にSQLがサニタイズされます。

keywords = input.split(/\s+/) 
queries = [] 
vars = [] 

keywords.each do |keyword| 
    queries << "(classifications.species LIKE '%?%' OR 
       classifications.family LIKE '%?%' OR 
       classifications.trivial_names LIKE '%?%' OR 
       place LIKE '%?%')" 
    vars = vars << keyword << keyword << keyword << keyword 
end 

options[:conditions] = [queries.join(' AND '), vars].flatten 
0

、その後使用して、奴らを組み合わせ、私はActiveRecordの中で、カスタム条件の多くを使用しますが、私は、条件配列の配列でそれらをパッケージ化しますか?値はARがそれらを自動的にsantizeすることを可能にします:

conditions = Array.new 
conditions << ["name = ?", "bob"] 
conditions << ["(created_at > ? and created_at < ?)", 1.year.ago, 1.year.from_now] 

User.find(:first, :conditions => combine_conditions(conditions)) 

def combine_conditions(somearray) # takes an array of condition set arrays and reform them into a AR-compatible condition array 
    conditions = Array.new 
    values = Array.new 
    somearray.each do |conditions_array| 
    conditions << conditions_array[0] # place the condition in an array 
    # extract values 
    for i in (1..conditions_array.size - 1) 
     values << conditions_array[i] 
    end 
    end 
    [conditions.join(" AND "), values].flatten 
end