我很困惑在哪里使用'.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
答案 0 :(得分:8)
这些都是等价的。你在这里看到的是从AREL合并之前的ActiveRecord查询语法的演变。不过,较旧式的动态查找器仍然有效。
此语法来自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])
如有疑问,consult the ROR query guide。
我个人发现where
样式在您通过多行代码构建查询时非常有用,而不是一次完成。由于他们将执行推迟到最新时刻,因此他们允许您逐步构建查询。
答案 1 :(得分: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
答案 2 :(得分:0)
您应该更喜欢where
样式,Rails 4已弃用find_by_
- 请参阅http://edgeguides.rubyonrails.org/4_0_release_notes.html#active-record-deprecations