我有一个名为Max
的模型。
这将是查找此记录的更快捷方式:
假设user
是已设置的局部变量。
Max.where(:user_id => user.id)
或
Max.find_by_user_id(user.id)
假设此查询将频繁运行,并且user_id
表上的Maxes
列有一个索引。
这种或那种方式有什么好处吗?即一个产生较少的查询但运行较慢,反之亦然?
感谢。
答案 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表格 - 它更通用,只在需要时执行,并且可以链接。