我已经搜索但无法找到 ActiveRecord 和 ActiveRecord::relation 对象之间差异的简要说明。
我知道 ActiveRecord 是通过类似的东西找到的单个对象
User.find(1)
而 ActiveRecord::Relation 是类似对象的数组,通过类似的方式查找
User.where(id: 1)
我正在寻找它们在查询执行或对它们的深入解释方面的区别,因此它将清楚其背后的整个概念。
提前致谢!
我已经搜索但无法找到 ActiveRecord 和 ActiveRecord::relation 对象之间差异的简要说明。
我知道 ActiveRecord 是通过类似的东西找到的单个对象
User.find(1)
而 ActiveRecord::Relation 是类似对象的数组,通过类似的方式查找
User.where(id: 1)
我正在寻找它们在查询执行或对它们的深入解释方面的区别,因此它将清楚其背后的整个概念。
提前致谢!
的实例ActiveRecord::Base
是代表数据库中特定行的对象(或者可能保存到数据库中)。
而实例ActiveRecord::Relation
是可以针对您的数据库运行的查询的表示形式(但尚未运行)。通过调用to_a
,等运行该查询后each
,将返回单个实例或实例数组。first
Relation
ActiveRecord::Base
所有这些都在以下网站上进行了解释
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
当您通过 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 []>
它不会给出任何错误