条件之间的差异在相同或分开的地方

时间:2016-09-21 18:59:24

标签: ruby-on-rails

一个小而简单的问题,我有这两个示例子句:

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

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

我宁愿使用第二个,因为它更易读,更容易添加更多,如果我想,现在我的问题是:哪一个更快,更安全和/或更推荐?

谢谢你的答案=)

3 个答案:

答案 0 :(得分:1)

它们基本上是相同的查询。这主要是一个偏好问题。

一种简单的方法是在开发Rails环境中执行此操作,因为生成的SQL查询将写入开发日志。因此,您实际上可以看到Ruby语法的更改如何更改(或不更改)执行的实际SQL查询。

答案 1 :(得分: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

答案 2 :(得分: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'))