2016-09-21 30 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'))