0

我有一个模型叫Max.

这将是找到此记录的更快方法:

假设这user是一个已经设置的局部变量。

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

或者

Max.find_by_user_id(user.id)

假设这个查询会经常运行,并且表user_id上的列有一个索引Maxes

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

谢谢。

4

2 回答 2

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))

产生相同的查询,并花费相同的执行时间

于 2012-11-28T21:35:20.740 回答
2

尽管需要运行少量的 ruby​​ 代码,但它们是相同的。

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

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

于 2012-11-28T21:35:45.293 回答