想要在多个可选的where条件下构建rails活动记录查询。
示例:
我有一个患者搜索表单,可以按ID,姓名和电子邮件地址进行搜索。伪代码如下:
where_sql = ""
where_sql = {'name = ?", params[:name]} if params[:name]
where_sql = {'id = ?", params[:id]} if params[:id]
where_sql = {'email = ?", params[:email]} if params[:email]
Patient.where(where_sql)
如何构建以下查询而不必担心sql注入。
答案 0 :(得分:1)
如果您使用问号“?”占位符或哈希值ActiveRecord会自动为您转义值。请参阅导轨指南http://guides.rubyonrails.org/security.html#sql-injection
中的注射对策这可能是ransack gem的一个很好的用例(MetaWhere重写)https://github.com/ernie/ransack
答案 1 :(得分:0)
如果您只使用相同的条件,则可以这样做:
conditions = {}
conditions[:name] = params[:name] if params[:name]
conditions[:id] = params[:id] if params[:id]
conditions[:email] = params[:email] if params[:email]
Patient.where(conditions)
另外,看看一个伟大的searchlogic gem。