2010-11-18 15 views
2

Birden çok değeri bir sütuna sorgulamak için değerlere katılmakta güçlük çekiyorum. İşte ben bugüne kadar ne var: find_by_sql sql_injection koruma fazladan karakter ekler görünüyorRaylar - find_by_sql - Bir alan için birden çok değerde sorgulama

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

: sorguyu yapan

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 

. Bunu nasıl çalışırım?

cevap

0

to_query dizisini tek tırnak içine tüm değerler içeren virgülle ayrılmış bir dizeye katmayı ve bu dizeyi "?" Parametresi olarak geçirmeyi deneyin.

+0

Virgülle ayrılmış olarak katılmayı denedim ve bunu yapar - ('honda \', \ 'toyota'). Yine, sql enjeksiyonu sıfır kayıtla sonuçlanacak gibi görünüyor çünkü honda \ mevcut değil. Bunu yapmanın bir yolu olmalı. Birisi bunu daha önce deneyimlemiş olmalı. – oprogfrogo

4

Gerçekten find_by_sql'a ihtiyacınız var mı? Eğer bir SELECT * gerçekleştirerek, ve yöntem Car modeline bulunduğu varsayıyoruz beri daha iyi bir yolu olacaktır:

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

Not * parametre adı ... kullanın ve hemen sonra ihtiyacınız olmayacak Bir diziye tek bir parametre yapmak için kod yazmak. Eğer gerçekten find_by_sql gerekiyorsa

, bu şekilde yazmaya çalışıyorum:

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

Evet, gerçek veritabanımdaki gerçek veritabanına katılarak find_by_sql ile gittim. Her neyse bu işi yapmak için mi? – oprogfrogo

+0

Size bir 'find_by_sql' alternatifi sağlamak için cevabımı düzenledim. Buna bir bak. –

+0

Zaten dizilerden beri geçirilen değerlerin birleştirilmesine bile gerek duymama benziyor. Bu şimdi çalışıyor. – oprogfrogo

0

Sorun çözmek.

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 
İlgili konular