Разница между объектами ActiveRecord и ActiveRecord::Relation

Я искал, но не смог найти краткое объяснение разницы между ActiveRecord и объектом ActiveRecord::relation.

Я понимаю, что ActiveRecord - это единственный объект, найденный чем-то вроде

User.find(1)

И ActiveRecord::Relation - это массив, подобный объекту. Найти что-то вроде

User.where(id: 1)

Я ищу разницу между ними с точки зрения выполнения запросов или подробного объяснения о них, чтобы прояснить всю концепцию, стоящую за этим.

Заранее спасибо!


person power    schedule 12.07.2016    source источник


Ответы (3)


Экземпляр ActiveRecord::Base — это объект, который представляет определенную строку вашей базы данных (или может быть сохранен в базе данных).

Принимая во внимание, что экземпляр ActiveRecord::Relation является представлением запроса, который может быть запущен в вашей базе данных (но еще не запущен). Как только вы запустите этот запрос, вызвав to_a, each, first и т. д. для этого Relation, будет возвращен один экземпляр или массив из ActiveRecord::Base экземпляров.

person spickermann    schedule 12.07.2016
comment
спасибо @spickermann, когда я пытаюсь использовать консоль rails, он показывает, что SQL-запрос выполняется в случае активного отношения записи, но этого не должно быть, потому что это представление. Не могли бы вы объяснить об этом? - person power; 12.07.2016
comment
@power : он выполняется в консоли, потому что консоль вызывает inspect для этого отношения для вывода результата. Если вы измените строку, чтобы не возвращать отношение (например, User.where(id: 10); nil), вы увидите, что запрос не выполняется. В то время как User.find(10); nil по-прежнему будет выполнять запрос. - person spickermann; 12.07.2016

Все это объясняется на следующем сайте

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

person peter    schedule 12.07.2016

когда вы используете запись методом поиска, и эта запись отсутствует в базе данных, вы получите ошибку ниже

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 и если пользователь не присутствует в базе данных, вы получите нулевую запись, как показано ниже.

User.where(id: 10)


User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ?  [["id", 10]]
 => #<ActiveRecord::Relation []> 

Это не даст никакой ошибки

person Vishal    schedule 12.07.2016