如何将散列值转换为适合 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 位格式的数字,因此对于某些系统来说这可能是个问题。
之所以没有自动方式,是因为像这样转换并不难,而且很多转换都是高度上下文相关的。
我遇到的问题是散列中的值可能不是正确的数据类型,无法在 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 位格式的数字,因此对于某些系统来说这可能是个问题。
之所以没有自动方式,是因为像这样转换并不难,而且很多转换都是高度上下文相关的。