ruby ActiveRecord和ActiveRecord::Relation对象的区别

bejyjqdl  于 2023-04-05  发布在  Ruby
关注(0)|答案(3)|浏览(131)

我已经搜索过了,但找不到ActiveRecord和ActiveRecord::relation对象之间区别的简要说明。
我知道ActiveRecord是由类似于

User.find(1)

而ActiveRecord::Relation是类似数组的对象Find,类似于

User.where(id: 1)

我正在寻找它们之间在查询执行或深入解释方面的差异,因此它将明确其背后的整个概念。
先谢谢你了!

wfauudbj

wfauudbj1#

ActiveRecord::Base的示例是一个对象,它表示数据库的特定行(或者可能保存到数据库中)。
然而,ActiveRecord::Relation的示例是可以对数据库运行的查询的表示(但尚未运行)。一旦您通过调用to_aeachfirst等在Relation上运行该查询,将返回单个示例或ActiveRecord::Base示例的数组。

laik7k3q

laik7k3q2#

Rails使用activerecord作为标准的ORM,但这同样适用于activerecord本身。
简而言之:所有产生多个记录的查询,如scopes,all,where和joins,都会返回一个ActiveRecord::Relation对象。您可以将这些对象链接在一起,只有当您使用to_sql,first,each,any,to_a,take,last等方法时,才会执行查询并返回一个ActiveRecord::Base数组。

  • 所有这些都在following site上解释
  • 特别是关于作用域、查询方法和pluck示例的部分,展示了主要差异的所有细节
  • 另请参见the rails API以供参考
unhi4e5o

unhi4e5o3#

当你使用记录通过查找方法和记录不存在于数据库比你会得到下面的错误

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 []>

它不会给予任何错误

相关问题