2010-11-18 68 views
2

我無法將查詢多個值的值連接到一列。這是我走到這一步:Rails - find_by_sql - 使用多個值查詢一個字段

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

我試過加逗逗分開,它這樣做 - ('本田\',''豐田')。再次看起來像SQL注入踢在哪個將導致零記錄,因爲本田\不存在。有一種方法可以做到這一點。之前有人必須經歷過這一點。 – oprogfrogo 2010-11-18 23:27:35

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 2010-11-18 23:34:35

+0

我編輯了我的答案,爲您提供了一個'find_by_sql'替代方案。一探究竟。 – 2010-11-18 23:43:24

+0

看起來我甚至不需要做任何傳遞值的連接,因爲它們已經是數組了。現在正在工作。 – oprogfrogo 2010-11-18 23:54:50

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