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.
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
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
:tracks and a
Track resource that
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.