为了避免 SQL 注入,我们使用 ActiveRecord 的参数化查询,例如:
House.where("year_built > ?", 2000)
效果很好(上面的例子不是最佳的,因为它也可以是
House.where(year_built: [2000..])
,但它只是为了上下文)。
但是,当使用 JSON 列时,存在一个问题,传递给 WHERE 的值总是转换为字符串,例如“2000”而不是 2000。这是行不通的:
House.where("data->'$.year_built' > ?", 2000)
当我们比较整数和字符串时,WHERE (data->'$.yearBuilt' > '2000')"
找不到任何结果。
有没有办法强制 Rails 中的参数化查询将
?
始终转换为数字?
你有没有发现它不起作用?根据SQL手册:
根据需要,字符串会自动转换为数字,数字也会自动转换为字符串。
在我随时可用的应用程序中,我尝试过:
Household.where("income > ?",40).to_sql
#=>"SELECT `households`.* FROM `households` WHERE (income > '40')"
所以看起来好像是将整数(收入列)与字符串进行比较。然而 mySQL 进行了必要的转换并产生了预期的结果。