我遇到的问题是,为了在where子句中获得成功,散列中的值可能不是正确的数据类型(举个例子)。
例如,可以在URL上传递筛选器参数:有些是字符串,有些是数字,有些是布尔值。最后的散列将类似于filter_parms:{id:"1“、active:"true”、name:“John”等等。问题应该是显而易见的:一切都被视为字符串。我试图找到一种方法来自动强制这些值成为正确的数据类型(例如," 1“=> 1、"true”=> true),以一种很好的、优雅的方式来实现,而不需要循环并造成编码混乱。
最终目标是能够在如下内容中使用哈希: Person.where(filter_parms)。这对于字符串字段很好,但对于布尔和int则不行。
我尝试过使用sanitize_sql_for_conditions,但是它的输出与输入数据类型完全匹配,无需进行任何修改。
我想有明显的东西我错过了。谢谢你的帮助。
发布于 2017-04-09 15:11:05
您可以这样做来规范您的数据:
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"
,而您希望将其保存下来,就会损坏它,同样,表单8889991111
的电话号码也会被强制转换为可能不适合32位格式的数字,因此对某些系统来说,这可能是一个问题。
之所以没有自动的方法,是因为像这样的转换并不难,而且很多转换都是上下文相关的。
https://stackoverflow.com/questions/43312832
复制