2009-01-01 35 views
5

我對Rails相當陌生,對於一些專家在構建包含許多條件的非常複雜的SQL查詢時使用的一些約定很好奇。具體來說,保持代碼的可讀性和可維護性。在Rails中指定複雜SQL查詢的約定是什麼?

有一對夫婦的方法,我能想到的:

單行線,在打電話找():

@pitchers = Pitcher.find(:all, "<conditions>") 

使用預定義的字符串,並傳遞它:

@pitchers = Pitcher.find(:all, @conditions) 

使用私人會員功能返回查詢

@pitchers = Pitcher.find(:all, conditionfunction) 

我傾向於私人成員函數約定,另外,因爲您可以傳入參數來自定義查詢。

對此有何看法?

回答

7

我幾乎從不將條件傳遞給find。通常這些條件對於在模型中以named_scope的形式添加到對象模型或者甚至只是在模型上使用類方法都很有用。命名範圍很好,因爲你可以鏈接它們,這需要一點點複雜性。它們也允許你傳遞參數。

另外,您幾乎不應該只傳遞原始SQL條件字符串。您應該使用散列樣式(:conditions => { :name => 'Pat' })或陣列樣式(['name = ?', 'Pat'])。通過這種方式,您可以逃脫SQL,爲SQL注入攻擊提供一些保護。

最後,我認爲您正在考慮的方法,您嘗試在所調用的任何環境中創建條件的方法是錯誤的方法。模型的工作是提供一個接口,通過該接口返回相關的響應。如果你問我,試圖確定傳遞給find調用的條件太接近底層實現。再加上它很難測試。

+0

優秀的評論,謝謝! – unknownuser 2009-01-01 20:43:51