Reputation: 1265
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
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
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
All this is explained on the following site
pluck
show all the details on the main differencesSee also the rails API for reference
Upvotes: 6
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