ActiveRecord和ActiveRecord :: Relation对象之间的区别

时间:2016-07-12 09:55:42

标签: ruby-on-rails ruby activerecord rails-activerecord active-relation

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

我知道ActiveRecord是通过类似

找到的单个对象
User.find(1)

和ActiveRecord :: Relation是像对象一样的数组。像

这样的东西
User.where(id: 1)

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

提前致谢!

3 个答案:

答案 0 :(得分:8)

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

ActiveRecord::Relation的实例是可以针对您的数据库运行的查询的表示(但尚未运行)。通过在to_a上调用eachfirstRelation等运行该查询后,将返回单个实例或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