2017-04-09 83 views
0

我遇到的问题是散列中的值可能不是正确的数据类型,以便在where子句中成功(如一个示例)。如何将散列值转换为SQL查询的适当数据类型

例如,可以在URL上传递过滤器参数:一些可能是字符串,一些数字,一些布尔值。最后的哈希值将是类似filter_parms:{id:“1”,active:“true”,name:“John”}等等。问题应该是显而易见的:一切都被视为一个字符串。我试图找到一种方法来自动将值强制转换为正确的数据类型(例如“1”=> 1,“true”=> true),而且没有循环和创建编码混乱。

最终目标是能够像这样使用散列:Person.where(filter_parms)。这适用于String字段,但不适用于boolean和int。

我已经尝试使用sanitize_sql_for_conditions,但其输出完全匹配输入数据类型而不作任何修改。

我想有些事情显而易见,我很想念。谢谢你的帮助。

回答

2

你可以做一些事情来规范这样的数据:

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位格式的数字,因此这对于某些系统可能是个问题。

没有自动方式的原因是因为像这样转换并不难,再加上大量的转换是高度上下文的。

+0

您可以查看'Model.columns'及其'#sql_type's以减少出错的可能性。 –

+0

我当然希望有一种方式可以通过某种由模型驱动的消毒剂驱动价值观。不确定Rails如何处理发布的表单数据。我假设在帖子中有一些内容明确地声明了每个parm的数据类型。 – vicmorrowshead

+0

@muistooshort - 如果只是至少要保持一致和彻底,我将签出Model.columns ... – vicmorrowshead