2010-11-18 30 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