如何将散列值转换为适合 SQL 查询的数据类型

How to convert hash values into appropriate data types for SQL queries

我遇到的问题是散列中的值可能不是正确的数据类型,无法在 where 子句中成功(举一个例子)。

例如,可以在URL上传递过滤器参数:有些可能是字符串,有些是数字,有些是布尔值。最终的哈希值类似于 filter_parms: {id: "1", active: "true", name: "John"} 等等。问题应该很明显:一切都被视为字符串。我正在尝试找到一种方法,以一种漂亮、优雅的方式自动将值强制转换为正确的数据类型(例如“1”=> 1,"true" => true),而不会循环并造成编码混乱.

最终目标是能够像这样使用散列:Person.where(filter_parms)。这适用于字符串字段,但不适用于布尔值和整数。

我试过使用sanitize_sql_for_conditions,但它的输出与输入数据类型完全匹配,没有做任何修改。

我想我显然遗漏了一些东西。感谢您的帮助。

您可以像这样规范化数据:

def normalize(value)
  case (value)
  when 'true'
    true
  when 'false'
    false
  when 'null','nil'
    nil
  when /\A-?\d+\z/
    value.to_i
  when /\A-?\d+\.\d+\z/
    value.to_f
  else
    value
  end
end

这里存在错误解释这些值的风险,例如,如果一个字段可能包含字符串文字 "true" 而您希望保留它,这将破坏它,同样地,phone 形式的数字8889991111 将被强制转换为可能不适合 32 位格式的数字,因此对于某些系统来说这可能是个问题。

之所以没有自动方式,是因为像这样转换并不难,而且很多转换都是高度上下文相关的。