我已经搜索过,但无法找到有关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
的实例是对可以针对数据库运行的查询的表示(但尚未运行)。一旦通过在该 Relation
上调用 to_a
、each
、first
等来运行该查询,将返回单个实例或 ActiveRecord::Base
实例数组。
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
User.where(id: 10)
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? [["id", 10]]
=> #<ActiveRecord::Relation []>
它不会产生任何错误
inspect
来输出结果。如果您更改该行以不返回关系(例如User.where(id: 10); nil
),则会发现查询未运行。而User.find(10); nil
仍将运行查询。 - spickermannActiveRecord::Base
代表数据库中的一行,而ActiveRecord::Relation
代表将查询数据库的SQL查询?因此,这可能是FinderMethods和QueryMethods之间的根本区别,对吗? - J.R. Bob Dobbs