我已搜索但无法找到ActiveRecord和ActiveRecord :: relation对象之间差异的简要说明。
我知道ActiveRecord是通过类似
找到的单个对象User.find(1)
和ActiveRecord :: Relation是像对象一样的数组。像
这样的东西User.where(id: 1)
我在查询执行或对它们的深入解释方面寻找它们之间的区别,因此它将清除它背后的整个概念。
提前致谢!
答案 0 :(得分:8)
ActiveRecord::Base
的实例是一个对象,表示数据库的特定行(或者可能保存到数据库中)。
ActiveRecord::Relation
的实例是可以针对您的数据库运行的查询的表示(但尚未运行)。通过在to_a
上调用each
,first
,Relation
等运行该查询后,将返回单个实例或ActiveRecord::Base
个实例数组。
答案 1 :(得分:1)
当你使用find方法记录时,数据库中没有的记录比你得到的错误
DECLARE
TYPE temp_rec_TYPE IS RECORD (
n_temp_id NUMBER
);
TYPE temp_tab_TYPE IS TABLE OF temp_rec_TYPE INDEX BY PLS_INTEGER;
temp_tab temp_tab_TYPE;
n_temp_id2 NUMBER;
BEGIN
temp_tab(1).n_temp_id := 1;
FOR temp_rec IN (SELECT * FROM example_table WHERE id IN temp_tab)
LOOP
NULL;
END LOOP;
END;
如果您发现用户的条件是什么,如果用户不在数据库中,那么您将获得如下所示的nill记录
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
它不会给出任何错误
答案 2 :(得分:1)
所有这些都在以下网站上解释
http://guides.rubyonrails.org/active_record_querying.html
Rails使用activerecord作为标准ORM,但同样适用于activerecord。
简而言之:产生多个记录(如scope,all,where和join)的所有查询都返回ActiveRecord::Relation
个对象。您可以将这些链接在一起,只有当您使用类似to_sql的方法时,首先,每个,任何,to_a,take,last等执行查询。
另见 http://api.rubyonrails.org/classes/ActiveRecord/Relation.html