10

我已经搜索但无法找到 ActiveRecord 和 ActiveRecord::relation 对象之间差异的简要说明。

我知道 ActiveRecord 是通过类似的东西找到的单个对象

User.find(1)

而 ActiveRecord::Relation 是类似对象的数组,通过类似的方式查找

User.where(id: 1)

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

提前致谢!

4

3 回答 3

14

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

而实例ActiveRecord::Relation是可以针对您的数据库运行的查询的表示形式(但尚未运行)。通过调用to_a,等运行该查询后each,将返回单个实例或实例数组。firstRelationActiveRecord::Base

于 2016-07-12T10:16:37.670 回答
2

所有这些都在以下网站上进行了解释

http://guides.rubyonrails.org/active_record_querying.html

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

简而言之:所有产生多个记录的查询,如范围、全部、位置和连接都返回一个ActiveRecord::Relation对象。您可以将它们链接在一起,并且只有当您使用诸如 to_sql、first、each、any、to_a、take、last 等方法时才会执行查询。

另请参阅 http://api.rubyonrails.org/classes/ActiveRecord/Relation.html

于 2016-07-12T10:40:09.180 回答
1

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

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 条件找到用户并且如果用户不存在于数据库中,那么您将获得如下所示的 nill 记录

User.where(id: 10)


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

它不会给出任何错误

于 2016-07-12T10:14:28.840 回答