使用带有连接的占位符

我试图通过在连接上替换我的参数来避免任何SQL注入漏洞。

Category.joins("LEFT OUTER JOIN incomes ON incomes.category_id = categories.id AND incomes.dept_id = ?", params[:Dept]) 

这会尝试在其中执行带有问号的查询,而不是将其替换为param。 这样做的正确方法是什么?

编辑:

查询需要返回:

 SELECT categories.* FROM "categories" LEFT OUTER JOIN incomes ON incomes.category_id = categories.id AND incomes.dept_id = 86 

 SELECT categories.* FROM "categories" LEFT OUTER JOIN incomes ON incomes.category_id = categories.id WHERE incomes.dept_id = 86 

结果非常不同!

一种选择是使用sanitize_sql_array方法。 但是,它是一种受保护的方法,所以在您的类别模型上,您可以这样做:

 class Category < ActiveRecord::Base def self.income_for_dept(dept) Category.joins(sanitize_sql_array(["LEFT OUTER JOIN incomes ON incomes.category_id = categories.id AND incomes.dept_id = ?", dept])) end end 

然后你会称之为:

 Category.income_for_dept(params[:Dept]) 

如果需要,Ruby提供了一些其他方法来获取该方法,而无需在Category中创建类方法。

尝试

 Category.joins(:incomes).where(:incomes => { :dept_id => params[:Dept] }) 

并查看Rails文档以获取连接表 。