1

我对在哪里使用“.find”以及在哪里使用“where”感到困惑。执行查询期间的性能是否有差异?

示例:转换使用 .find 的现有查询,如下所示:

FileOrFolder.find_by_fullpath(completePath, :select=>"id") -->

FileOrFolder.where(fullpath: completePath).select(:id).first

Component.find(:first, :conditions=>["cluster_id = ? AND name = ?", cluster_id, key]) -->

Component.where(cluster_id: cluster_id, name: key).first
4

3 回答 3

8

这些都是等价的。您在这里看到的是 ActiveRecord 查询语法在AREL被合并之前的演变。不过,旧式动态查找器仍然有效。

此语法来自使用动态查找器的 ROR 2.x 及更早版本:

FileOrFolder.find_by_fullpath(completePath, :select=>"id")

而这些更多的是 ROR 3.x 风格:

FileOrFolder.where(fullpath: completePath).select(:id).first
Component.where(cluster_id: cluster_id, name: key).first

你的最后一个例子find在任何一种情况下都是有效的。

Component.find(:first, :conditions=>["cluster_id = ? AND name = ?", cluster_id, key])

如有疑问,请查阅 ROR 查询指南

我个人发现,where当您通过几行代码而不是一次全部构建查询时,这些样式非常有用。由于它们将执行推迟到最后一刻,它们让您可以零碎地构建查询。

于 2013-06-26T16:08:32.517 回答
1

它不会产生显着的性能差异,因为通常它们都会生成相同的 SQL,例如:

Article.find_by_headline('foo')
=> SELECT `articles`.* FROM `articles` WHERE `articles`.`headline` = 'foo' LIMIT 1

Article.where(headline: 'foo').first
=> SELECT `articles`.* FROM `articles` WHERE `articles`.`headline` = 'foo' LIMIT 1
于 2013-06-26T16:05:28.373 回答
0

您应该更喜欢where风格,Rails 4 已弃用find_by_- 请参阅http://edgeguides.rubyonrails.org/4_0_release_notes.html#active-record-deprecations

于 2013-06-26T16:09:00.277 回答