2017-04-09 88 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

相關問題