哪个更快`Model.where(:attribute)`或`Model.find_by_attribute_id(id)`?

时间:2012-11-28 21:30:03

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

我有一个名为Max的模型。

这将是查找此记录的更快捷方式:

假设user是已设置的局部变量。

Max.where(:user_id => user.id)

Max.find_by_user_id(user.id)

假设此查询将频繁运行,并且user_id表上的Maxes列有一个索引。

这种或那种方式有什么好处吗?即一个产生较少的查询但运行较慢,反之亦然?

感谢。

2 个答案:

答案 0 :(得分:4)

.where方法的主要优点是返回ActiveRecord :: Relation (行为类似数组,可以为空,如果没有记录匹配给出的条件)。 .where的另一大优势是你可以链接它们,对范围非常有用!

使用.find返回Object或引发ActiveRecord :: RecordNotFound 错误。


因此,假设您没有用户匹配您传递的ID:

Max.find(-1) # => Raise ActiveRecord::RecordNotFound: Couldn't find Project with ID=-1

Max.where(id: -1) # => Returns an empty ActiveRecord::Relation, doesn't raise an error

更新

我尝试并在我的IRB控制台中比较了以下2个(数据库中约有620个记录)

User.find(User.all.map(&:id))
User.where(id: User.all.map(&:id))

生成相同的查询执行相同的执行时间

答案 1 :(得分:2)

尽管需要运行的红宝石代码微不足道,但它们完全相同。

检查您的开发日志。他们生成相同的SQL

我更喜欢新的AREL表格 - 它更通用,只在需要时执行,并且可以链接。