2017-04-09 6 views
0

問題はハッシュの値は、(一例として)where句で成功するためには正しいデータ・タイプではないかもしれないです問い合わせます。いくつかの文字列であり、いくつかの数字、いくつかのブール:は私が午前

例えば、フィルタのURLに渡されるパラメータがあります。最終的なハッシュは、filter_parms:{id: "1"、アクティブ: "true"、名前: "John"}などのようになります。問題は明白でなければなりません。すべてが文字列として扱われます。私はループしたり、コーディング混乱を生ずることなく、適切なデータ型(例えば、 "1" => 1、 "true" => true)になるように値を自動的に強制する方法を見つけようとしています。

最終目標は、このようなものでハッシュを使用できるようにすることです:Person.where(filter_parms)。これはStringフィールドではうまく動作しますが、booleanとintでは正しく動作しません。

Iは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 - ModelColumnsが少なくとも一貫性があり、徹底しているかどうかをチェックアウトします。 – vicmorrowshead

関連する問題