Sql 使用带有连接的占位符

Sql 使用带有连接的占位符,sql,ruby-on-rails,ruby,join,Sql,Ruby On Rails,Ruby,Join,我试图通过在连接上使用参数替换来避免任何SQL注入漏洞 Category.joins("LEFT OUTER JOIN incomes ON incomes.category_id = categories.id AND incomes.dept_id = ?", params[:Dept]) 这将尝试执行带有问号的查询,而不是将其替换为参数。正确的方法是什么 编辑: 查询需要返回以下内容: SELECT categories.* FROM "categories" LEFT OUTER

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

Category.joins("LEFT OUTER JOIN incomes ON incomes.category_id = categories.id AND incomes.dept_id = ?", params[:Dept])
这将尝试执行带有问号的查询,而不是将其替换为参数。正确的方法是什么

编辑:

查询需要返回以下内容:

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

非常不同的结果

试试看

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

一个选项是使用该方法。但是,它是一种受保护的方法,因此在您的类别模型上,您可以执行以下操作:

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

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

谢谢,但这不符合我的查询标准。这将在where子句上放置一个条件,而不是在join上。我需要返回所有类别,无论是否有匹配。我需要它专门按照
和incomers.dept\u id
进行过滤,否则这个查询就不起作用了。这正是我要找的。非常感谢。
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])