.find或活动记录查询中的条件

时间:2013-06-26 16:00:23

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord ruby-on-rails-3.2

我很困惑在哪里使用'.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

3 个答案:

答案 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