2010-11-18 11 views
2

Ich habe Probleme, die Werte für die Abfrage mehrerer Werte zu einer Spalte beizutreten. Hier ist, was ich habe, so weit:Rails - find_by_sql - Abfrage mit mehreren Werten für ein Feld

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 

, dass die Abfrage in macht:

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

Es scheint find_by_sql sql_injection Schutz die zusätzlichen Zeichen hinzufügt. Wie bekomme ich das zum Laufen?

Antwort

0

Versuchen Sie, das to_query-Array in eine durch Kommas getrennte Zeichenfolge mit allen Werten in einfachen Anführungszeichen zu verknüpfen und diese Zeichenfolge dann als Parameter "?" Zu übergeben.

+0

Ich habe versucht, mit Komma getrennt und es tut dies - ('Honda \', \ 'Toyota'). Wieder scheint die sql-Injektion zu treten, was zu null Datensätzen führt, weil honda \ nicht existiert. Es muss einen Weg geben, dies zu tun. Jemand muss das schon einmal erlebt haben. – oprogfrogo

4

Benötigen Sie wirklich find_by_sql? Da Sie eine SELECT * Leistung erbringt, und vorausgesetzt, Ihre Methode auf dem Car Modell befindet, wäre ein besserer Weg:

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

Notiere die * direkt nach der Parametername ... Verwenden Sie es und Sie werden nicht brauchen Code schreiben, um einen einzelnen Parameter zu einem Array zu machen.

Wenn Sie wirklich find_by_sql brauchen, versuchen Sie es auf diese Weise zu schreiben:

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

Ja, ich schließe mich Legacy-Datenbanken in meiner tatsächlichen Abfrage an, also ging ich mit find_by_sql. Wie auch immer, damit das funktioniert? – oprogfrogo

+0

Ich habe meine Antwort bearbeitet, um Ihnen eine 'find_by_sql' Alternative zu bieten. Hör zu. –

+0

Sieht so aus, als ob ich nicht einmal die übergebenen Werte verbinden musste, da sie bereits Arrays waren. Das funktioniert jetzt. – oprogfrogo

0

Problem zu lösen.

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 
Verwandte Themen