2017-04-09 13 views
0

문제는 해시 값이 올바른 데이터 형식이 아니기 때문에 where 절에서 성공할 수 있다는 것입니다 (한 예로).해시 값을 SQL 쿼리의 적절한 데이터 형식으로 변환하는 방법

예를 들어 URL에 전달 될 수있는 필터 매개 변수가 있습니다. 일부는 문자열, 일부 숫자, 일부 부울 일 수 있습니다. 최종 해시는 filter_parms : {id : "1", 활성 : "true", 이름 : "John"} 등과 같이됩니다. 문제는 분명해야합니다. 모든 것이 문자열로 취급됩니다. 루핑을하지 않고 코드 엉망을 만들지 않고 멋지고 우아한 방식으로 값을 올바른 데이터 유형 (예 : "1"=> ​​1, "true"=> true)으로 자동 변환하는 방법을 찾으려고합니다.

최종 목표는 다음과 같이 해시를 사용할 수있게하는 것입니다. Person.where (filter_parms). 이 문자열 필드에 대한 있지만 boolean 및 int 잘 작동합니다.

sanitize_sql_for_conditions를 사용해 보았지만 그 출력은 수정하지 않고 입력 데이터 유형과 정확히 일치합니다.

제가 실종되었다는 것이 분명해 보입니다. 당신의 도움을 주셔서 감사합니다. 필드가 "true" 리터럴 문자열을 포함 할 수 있다면 같은 잘못 값을 해석 여기에 위험이있다

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 

하고 보존하는 것이이 그것을 탈수합니다 원하는 :

답변

2

이 같은 데이터를 정상화하는 일을 할 수있다 마찬가지로 양식 8889991111의 전화 번호는 32 비트 양식에 맞지 않는 숫자로 강제 변환되기 때문에 일부 시스템에서는 문제가 될 수 있습니다.

자동 변환 방법이없는 이유는이 변환이 어렵지 않기 때문이며 많은 전환이 매우 문맥 적입니다.

+0

'Model.columns'와 그'# sql_type'을 보면 오류가 발생하기 쉬운 것들을 만들 수 있습니다. –

+0

저는 모델에 의해 구동되는 일종의 소독제를 통해 가치를 이끌어 낼 수있는 방법이 있었으면 좋았을 것입니다. 게시 된 양식 데이터에서 Rails가이를 어떻게 처리하는지 확신하지 못합니다. 각 parm의 데이터 유형을 명시 적으로 선언하는 게시물에 뭔가 있다고 가정합니다. – vicmorrowshead

+0

@muistooshort - 적어도 일관되고 철저해야한다면 Model.columns를 체크 아웃 할 것입니다 ... – vicmorrowshead