首页 > 解决方案 > 如何清理 Arel SQL?

问题描述

我有以下 Arel SQL:

Arel.sql("(users.last_donated_at IS NOT NULL AND users.last_donated_at < '#{User::ACTIVE_DONOR_WITHIN_DAYS.days.ago}')")

当我运行刹车时我会收到SQL Injection警告。我尝试了以下方法:

Arel.sql("(users.last_donated_at IS NOT NULL AND users.last_donated_at < ?)", User::ACTIVE_DONOR_WITHIN_DAYS.days.ago)

但是,我收到以下错误:

ArgumentError:
       wrong number of arguments (given 2, expected 1)

如何使用 Arel 清理 sql 语句?

标签: sqlruby-on-railssql-injectionarel

解决方案


我正在回答我自己的问题。我在 Github wiki 之后使用 Arel 来获取 Ransack gem。我正在做与文档中提到的第 2.2 点非常相似的事情:https ://github.com/activerecord-hackery/ransack/wiki/Using-Ransackers 。为了清理参数并避免刹车sql injection警告,我最终做了以下事情:

Arel.sql(sanitize_sql_array("(users.last_donated_at IS NOT NULL AND users.last_donated_at < '#{User::ACTIVE_DONOR_WITHIN_DAYS.days.ago}')"))

推荐阅读