Active Record is a Object Relational Mapping System. When thinking of the MVC design model it is the 'M' (Model) and it represents the data and logic. Active Record is very powerful but sometimes it can get tricky and confusing. I'm going to try to help with some of the confusion of Active Record Associations in rails.
First let's talk about what Active Record associations are implemented in rails. Currently, rails supports six types of associations. belongs_to
has_one
has_many
has_many :through
has_one :through
has_and_belongs_to_many
The first couple of these are pretty easy to understand. belongs_to
means that resource a belongs to resource b. An example of this is, if I had a music app, let's says a youtube like application. I have a track
resource and a genre
resource, My track
would belongs_to
the genre
Here's how I would set up that in my rails app.
class Track < ApplicationRecord
belongs_to :genre
end
class Genre < ApplicationRecord
has_many :tracks
end
So, now my app has a Genre
resource that has_many
:tracks
and a Track
resource that belongs_to
a genre
That's all great and all but what does this really mean and why does it matter? Let's check that out! I already have my seeds.rb
file set up so if I run rake db:seed
(make sure you don't have any pending migrations) and rails c
to go into the console. I can check this out. Now that I'm in the console I can run Track.all
and you will see that I have a genre_id associated with the Track automatically.
=> #<ActiveRecord::Relation [#<Track id: 1, title: "First Track", artist: "Randy", year: "2021", created_at: "2021-02-20 20:09:45.283145000 +0000", updated_at: "2021-02-20 20:09:45.283145000 +0000", genre_id: 1>]>
Now if I want to check what the genre id is for track#1 I can
2.6.1 :004 > Track.first.genre_id
Track Load (0.4ms) SELECT "tracks".* FROM "tracks" ORDER BY "tracks"."id" ASC LIMIT $1 [["LIMIT", 1]]
=> 1
But that's not all, I can also get all the tracks associated with a particular Genre like so:
2.6.1 :006 > Genre.first.tracks
Genre Load (0.3ms) SELECT "genres".* FROM "genres" ORDER BY "genres"."id" ASC LIMIT $1 [["LIMIT", 1]]
Track Load (0.2ms) SELECT "tracks".* FROM "tracks" WHERE "tracks"."genre_id" = $1 /* loading for inspect */ LIMIT $2 [["genre_id", 1], ["LIMIT", 11]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Track id: 1, title: "First Track", artist: "Randy", year: "2021", created_at: "2021-02-20 20:09:45.283145000 +0000", updated_at: "2021-02-20 20:09:45.283145000 +0000", genre_id: 1>]>
2.6.1 :007 >
This is all made possible because we set up our Active Record associations within each of our models.
This will be more important and useful once we get our app built out and we add more and more Tracks and Genres. Next week I will dive into the has_many_through
association, which for me was one of the more difficult associations to process.
Here's a couple of resources if you need some additional help or just want to learn more:
Rails Guides
Rubynnrails.org
Top comments (0)