power
power

Reputation: 1265

Difference between ActiveRecord and ActiveRecord::Relation objects

I have searched but not able to find the brief explanation for the difference between ActiveRecord and ActiveRecord::relation object.

I have understand that ActiveRecord is the single object find by something like

User.find(1)

And ActiveRecord::Relation is the array like object Find by something like

User.where(id: 1)

I am looking for the difference between them in terms of query execution or deep explanation about them, so it will clear the whole concept behind it.

Thanks in advance!

Upvotes: 15

Views: 9422

Answers (3)

spickermann
spickermann

Reputation: 106802

An instance of ActiveRecord::Base is an object that represents a specific row of your database (or might be saved into the database).

Whereas, an instance of ActiveRecord::Relation is a representation of a query that can be run against your database (but wasn't run yet). Once you run that query by calling to_a, each, first etc. on that Relation a single instance or an array of ActiveRecord::Base instances will be returned.

Upvotes: 25

peter
peter

Reputation: 42182

Rails uses activerecord as standard ORM but the same applies for activerecord on its own.

In short: all queries that yield multiple records like scopes, all, where, and joins return an ActiveRecord::Relation object. You can chain these together, and it is only when you use a method like to_sql, first, each, any, to_a, take, last etc that the query is executed and returns an array of ActiveRecord::Base instead


Upvotes: 6

Vishal
Vishal

Reputation: 7361

when you use record by find method and that record not present in the database than you will get below error

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

and if you find user by where condition and if user not present in database than you will get nill record like below

User.where(id: 10)


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

It will not give any error

Upvotes: 2

Related Questions