Ruby on rails 相同或分离条件之间的差异,其中

Ruby on rails 相同或分离条件之间的差异,其中,ruby-on-rails,Ruby On Rails,一个小而简单的问题,我有以下两个where示例条款: Product.where("name = ? AND is_done = ?", "test",false) Product.where(name:"test").where(is_done:false) 我宁愿使用第二个,因为它更可读,更容易添加更多,如果我想,现在我的问题是:哪一个更快,更安全和/或更推荐 感谢您的回答=)它们基本上是相同的查询。这主要是偏好的问题 一种简单的方法是在开发Rails环境中执行此操作,因为生成的SQL查

一个小而简单的问题,我有以下两个where示例条款:

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

Product.where(name:"test").where(is_done:false)
我宁愿使用第二个,因为它更可读,更容易添加更多,如果我想,现在我的问题是:哪一个更快,更安全和/或更推荐


感谢您的回答=)

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


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

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


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

这两个查询都是同样安全的,因为您已经正确地转义了第一个查询,而第二个查询是由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转义的。您可以使用“基准测试”在控制台中运行测试,以查看速度上的差异。在控制台中尝试:

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

这两种方法都是SQL注入安全的,存在一些细微的差异,可能会在性能/灵活性方面产生微小的差异。 第一个将清理参数并将其放入字符串中,而另一个将使用Arel创建查询。但是,第二个功能可以重写为更高效:

Product.where(name:"test", is_done:false) 
因为有一个函数调用,而不是两个

另一个区别是最后一个只能用于AND,而不能用于ORs,如果需要,您必须传递字符串,或者使用新的
运算符

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

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

这两种方法都是SQL注入安全的,存在一些细微的差异,可能会在性能/灵活性方面产生微小的差异。 第一个将清理参数并将其放入字符串中,而另一个将使用Arel创建查询。但是,第二个功能可以重写为更高效:

Product.where(name:"test", is_done:false) 
因为有一个函数调用,而不是两个

另一个区别是最后一个只能用于AND,而不能用于ORs,如果需要,您必须传递字符串,或者使用新的
运算符

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

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