Ruby Academy · Les

Associaties

has_many en belongs_to

Les 3 van 413 stappen

Associaties is een gratis Ruby Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Ruby Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Ruby Academy bevat in totaal 4 lessen.

Wat zijn associaties?

Associaties beschrijven relaties tussen modellen, zodat Active Record gerelateerde rijen voor je kan vinden. In plaats van SQL voor joins te schrijven, roep je methoden zoals user.posts aan.

  • Ze weerspiegelen de vreemde sleutels in je database.
  • Ze genereren automatisch hulpmethoden.
  • Ze zorgen ervoor dat code leest als het domein.

belongs_to

belongs_to geeft aan dat dit model een vreemde sleutel bevat die naar een ander model verwijst. Een Comment dat bij een Post hoort, heeft een kolom post_id.

class Comment < ApplicationRecord
  belongs_to :post
end

# comment.post returns the parent Post
# Requires a post_id column on comments

has_many

has_many is de andere kant: één record heeft meerdere records van een ander model. Een Post heeft meerdere Comment-records. De vreemde sleutel staat aan de kant met meerdere records.

class Post < ApplicationRecord
  has_many :comments
end

# post.comments returns all related comments
# post.comments.create(body: "Nice!")

Waar staat de vreemde sleutel?

Het model dat belongs_to gebruikt, bevat de vreemde sleutel. Voor Post en Comment bevat de tabel comments de kolom post_id. Stel dit in een migratie in met t.references :post of add_reference.

create_table :comments do |t|
  t.references :post, foreign_key: true
  t.text :body
  t.timestamps
end

Gegenereerde methoden

Met has_many :comments krijg je een verzameling met handige methoden:

  • post.comments om te lezen.
  • post.comments.create(...) om een gekoppeld record toe te voegen.
  • post.comments.count om te tellen.
  • post.comment_ids voor de id's.
post = Post.find(1)
post.comments.create(body: "First!")
puts post.comments.count

has_one

has_one beschrijft een één-op-éénkoppeling, zoals een User die één Profile heeft. De vreemde sleutel staat nog steeds op het andere model (profiles.user_id).

class User < ApplicationRecord
  has_one :profile
end

class Profile < ApplicationRecord
  belongs_to :user
end

Veel-op-veel met through

Gebruik voor een veel-op-veelrelatie een koppelingsmodel en has_many through. Een Student heeft meerdere Course-records via rijen in Enrollment.

class Student < ApplicationRecord
  has_many :enrollments
  has_many :courses, through: :enrollments
end

class Enrollment < ApplicationRecord
  belongs_to :student
  belongs_to :course
end

Opties voor afhankelijkheden

Bepaal met dependent wat er met onderliggende records gebeurt wanneer een bovenliggend record wordt verwijderd:

  • dependent: :destroy verwijdert ook de onderliggende records.
  • dependent: :nullify wist hun vreemde sleutel.
  • dependent: :restrict_with_error blokkeert het verwijderen.
class Post < ApplicationRecord
  has_many :comments, dependent: :destroy
end

Het N+1-queryprobleem

Als je door records loopt en een associatie gebruikt, kan er één query per record worden uitgevoerd: de gevreesde N+1. Het laden van 10 posts en hun reacties kan 11 query's uitvoeren in plaats van 2.

Hierdoor worden applicaties ongemerkt trager naarmate de hoeveelheid gegevens groeit.

# N+1: one query per post for comments
Post.all.each do |post|
  puts post.comments.count
end

N+1 oplossen met includes

Met includes laat je Active Record de associatie vooraf laden in een paar query's in plaats van in veel afzonderlijke query's. Dit is de standaardoplossing voor N+1.

Post.includes(:comments).each do |post|
  puts post.comments.count
end

Aangepaste namen met class_name

Als de naam van de associatie niet overeenkomt met het model, gebruik je opties zoals class_name en foreign_key. Bijvoorbeeld een associatie author die wordt ondersteund door het model User.

class Post < ApplicationRecord
  belongs_to :author, class_name: "User"
end

Kennischeck

Toets je begrip van associaties.

Samenvatting: associaties

Je hebt geleerd hoe je modellen aan elkaar koppelt:

  • belongs_to bevat de vreemde sleutel; has_many en has_one vormen de andere kant.
  • has_many through beschrijft veel-op-veelrelaties.
  • dependent bepaalt hoe trapsgewijze verwijderingen verlopen.
  • Voorkom N+1-query's met includes.

Vervolgens zorgen we met validaties voor gegevensintegriteit en leren we query's te schrijven.

Gratis beginnen

Leer Ruby met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
29
Lessen
109

Veelgestelde vragen

Is de les “Associaties” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad Ruby Academy, waaronder “Associaties”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Ruby Academy bevat in totaal 4 lessen.

Wat leer ik in “Associaties”?

has_many en belongs_to Je oefent met Ruby Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Ruby Academy te beginnen?

Ervaring vooraf is niet nodig. Ruby Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “Associaties”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Ruby Academy?

Ja. Elke les over Ruby Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. De basis van Active Record
  2. Migraties
  3. Associaties
  4. Validaties en query's
← Terug naar Ruby Academy