一个小而简单的问题,我有这两个示例子句:
Product.where("name = ? AND is_done = ?", "test",false)
Product.where(name:"test").where(is_done:false)
我宁愿使用第二个,因为它更易读,更容易添加更多,如果我想,现在我的问题是:哪一个更快,更安全和/或更推荐?
谢谢你的答案=)
答案 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'))