2010-11-18 31 views
2

複数の値を1つの列に照会するための値を結合する際に問題があります。ここで私はこれまで得たものです:Rails - find_by_sql - 1つのフィールドに複数の値を照会する

への問い合わせを行う
def self.showcars(cars) 
    to_query = [] 
    if !cars.empty? 
     to_query.push cars 
    end 
    return self.find_by_sql(["SELECT * FROM cars WHERE car IN (?)"]) 
end 

SELECT * FROM cars WHERE car IN (--- \n- \"honda\"\n- \"toyota\"\n') 

find_by_sql sql_injection保護は余分な文字を追加するようです。これをどのように機能させるには?

答えて

0

すべての値を一重引用符で囲んだカンマ区切り文字列にto_query配列を結合し、この文字列をパラメータ「?」として渡すことをお試しください。

+0

私はカンマ区切りで結合しようとしましたが、これは - ( 'honda \'、\ 'toyota')です。ホンダ\が存在しないので、SQLインジェクションが蹴っているように見えますが、レコードがゼロになるようです。これを行う方法があるはずです。誰かがこれを経験したに違いありません。 – oprogfrogo

4

本当にfind_by_sqlが必要ですか?あなたがSELECT *を実行し、あなたの方法はCarモデル上に存在すると仮定しているので、より良い方法は次のようになります。

class Car < ActiveRecord::Base 
    def self.showcars(*cars) 
    where('car in :cars', :cars => cars) 
    # or 
    where(:car => cars) 
    end 
end 

*パラメータ名は...それを使用した直後に、あなたが必要としません単一のパラメータを配列にするためのコードを記述します。

あなたが本当にそれをこのように書いてみる、find_by_sqlが必要な場合:

def self.showcars(*cars) 
    find_by_sql(['SELECT * FROM cars where car in (?)', cars]) 
end 
+0

はい、実際のクエリでレガシーデータベースに参加していますので、find_by_sqlを使用しました。とにかくこの作品を作るには? – oprogfrogo

+0

私はあなたの 'find_by_sql'の代わりに私の答えを編集しました。見てみな。 –

+0

渡された値が既に配列だったので、それを結合する必要はないようです。これは今働いています。 – oprogfrogo

0

問題の解決。

def self.average_time(time_init, time_end) 

    query = <<-SQL 
       SELECT COUNT(*) FROM crawler_twitters AS twitter WHERE CAST(twitter.publish AS TIME) BETWEEN '#{time_init}' AND '#{time_end}' 
        GROUP BY user) AS total_tweets_time; 
    SQL 

    self.find_by_sql(sanitize_sql(query)) 
    end 
関連する問題