ActiveRecord 和 ActiveRecord::Relation 对象之间的区别

Difference between ActiveRecord and ActiveRecord::Relation objects

我已经搜索过,但找不到关于 ActiveRecord 和 ActiveRecord::relation 对象之间区别的简要说明。

我了解到 ActiveRecord 是通过

之类的东西找到的单个对象
User.find(1)

而ActiveRecord::Relation是类似对象的数组通过类似

查找
User.where(id: 1)

我正在寻找它们在查询执行方面的区别或对它们的深入解释,因此它将清楚其背后的整个概念。

提前致谢!

当您通过查找方法使用记录并且数据库中不存在该记录时,您将得到以下错误

User.find(10)


User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 10]] ActiveRecord::RecordNotFound: Couldn't find User with 'id'=10

并且如果您通过 where 条件找到用户并且如果用户不存在于数据库中那么您将得到如下所示的空记录

User.where(id: 10)


User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ?  [["id", 10]]
 => #<ActiveRecord::Relation []> 

不会报错

ActiveRecord::Base 的实例是一个对象,表示您数据库的特定行(或者可能保存到数据库中)。

ActiveRecord::Relation 的实例表示可以针对您的数据库 运行 的查询(但还不是 运行)。一旦您 运行 通过调用 to_aeachfirst 等查询 Relation 单个实例或 ActiveRecord::Base 个实例数组将被退回。

Rails 使用 activerecord 作为标准 ORM,但同样适用于 activerecord 本身。

简而言之:所有产生多条记录的查询,如范围、全部、位置和连接 return 一个 ActiveRecord::Relation 对象。你可以 chain 它们在一起,只有当你使用像 to_sql、first、each、any、to_a、take、last 等方法时,查询被执行并且 returns 是一个 ActiveRecord::Base 的数组而不是