문제는 해시 값이 올바른 데이터 형식이 아니기 때문에 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
하고 보존하는 것이이 그것을 탈수합니다 원하는 :
'Model.columns'와 그'# sql_type'을 보면 오류가 발생하기 쉬운 것들을 만들 수 있습니다. –
저는 모델에 의해 구동되는 일종의 소독제를 통해 가치를 이끌어 낼 수있는 방법이 있었으면 좋았을 것입니다. 게시 된 양식 데이터에서 Rails가이를 어떻게 처리하는지 확신하지 못합니다. 각 parm의 데이터 유형을 명시 적으로 선언하는 게시물에 뭔가 있다고 가정합니다. – vicmorrowshead
@muistooshort - 적어도 일관되고 철저해야한다면 Model.columns를 체크 아웃 할 것입니다 ... – vicmorrowshead