【发布时间】:2015-03-16 02:36:34
【问题描述】:
我正在努力清理原始 SQL 查询,其中 WHERE 条件可能具有值或为 NULL。我希望使用 Active Record 的内置消毒剂...
(注意:我将使用一个简化查询来进行演示——我们真正的查询是一个跨不同模型类型的复杂 UNION,很难使用AR查询界面)
尝试 1:
raw_query = "SELECT * FROM folders WHERE user_id = ? AND parent_id = ?"
sanitized_query = ActiveRecord::Base.send(:sanitize_sql_array, [raw_query, current_user.id, params[:parent_id]])
results = ActiveRecord::Base.connection.execute(sanitized_query);
但如果 params[:parent_id] 为 nil,则 sanitized_query 最终为
SELECT * FROM folders WHERE user_id = 1 AND parent_id = NULL
这是无效的,因为parent_id = NULL 应该是parent_id IS NULL
尝试 2:
然后我找到了sanitize_sql_hash 方法,它似乎非常适合构建条件:
sanitized_conditions = ActiveRecord::Base.send(:sanitize_sql_hash, {user_id: current_user.id, parent_id: params[:parent_id]})
sanitized_query = "SELECT * FROM folders WHERE #{sanitized_conditions}"
results = ActiveRecord::Base.connection.execute(sanitized_query);
但第一行失败:
NoMethodError: 未定义的方法 `abstract_class?'对象:类
该方法也被列为已弃用,并将在 Rails 5 中删除,但它正是我正在寻找的。还有其他方法可以从值的哈希中生成安全的 WHERE 条件吗?
【问题讨论】:
标签: sql ruby-on-rails activerecord sanitization