2016-09-21 31 views
0

一個小而簡單的問題,我有這些2個,其中示例子句:差異或分離其中

Product.where("name = ? AND is_done = ?", "test",false) 

Product.where(name:"test").where(is_done:false) 

我寧願使用第二之一,因爲它更容易閱讀和添加更多的其中如果我想,現在我的問題是:哪一個更快,更安全和/或更值得推薦?

感謝您的答案=)

回答

1

兩者都是同樣安全的,因爲你已經正確地逃脫了第一個,第二個被Rails轉義。您可以使用「基準測試」在控制檯中運行測試以查看速度差異。在您的控制檯嘗試:

require 'benchmark' 

Benchmark.measure do 
    Product.where("name = ? AND is_done = ?", "test",false) 
end 

然後比較

Benchmark.measure do 
    Product.where(name:"test").where(is_done:false) 
end 
1

他們基本上是相同的查詢。這主要是一個偏好問題。

一個簡單的方法來看到這是在開發Rails環境中這樣做,因爲生成的SQL查詢將寫入開發日誌。因此,您實際上可以看到Ruby語法中的更改如何更改(或不更改)實際執行的SQL查詢。

1

這兩種方法都是SQL注入安全的,也有一些細微的差別,可能使性能/小的差異的靈活性。 第一個將清理params並將它們放入字符串中,而另一個將使用Arel創建查詢。然而第二個功能可以被改寫爲更高效:

Product.where(name:"test", is_done:false) 

由於存在對函數的調用而不是兩個函數。

另一個區別是最後一個只能用於AND,但不能用於OR,在需要的情況下,您必須傳遞字符串或使用新的.or運算符。

Product.where("name = ? OR is_done = ?", "test",false) 

Post.where('id = 1').or(Post.where('id = 2'))