一个小而简单的问题,我有这些2个,其中示例子句:差异或分离其中
Product.where("name = ? AND is_done = ?", "test",false)
Product.where(name:"test").where(is_done:false)
我宁愿使用第二之一,因为它更容易阅读和添加更多的其中如果我想,现在我的问题是:哪一个更快,更安全和/或更值得推荐?
感谢您的答案=)
一个小而简单的问题,我有这些2个,其中示例子句:差异或分离其中
Product.where("name = ? AND is_done = ?", "test",false)
Product.where(name:"test").where(is_done:false)
我宁愿使用第二之一,因为它更容易阅读和添加更多的其中如果我想,现在我的问题是:哪一个更快,更安全和/或更值得推荐?
感谢您的答案=)
两者都是同样安全的,因为你已经正确地逃脱了第一个,第二个被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
他们基本上是相同的查询。这主要是一个偏好问题。
一个简单的方法来看到这是在开发Rails环境中这样做,因为生成的SQL查询将写入开发日志。因此,您实际上可以看到Ruby语法中的更改如何更改(或不更改)实际执行的SQL查询。
这两种方法都是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'))