Associaties
has_many en belongs_to
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 commentshas_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
endGegenereerde methoden
Met has_many :comments krijg je een verzameling met handige methoden:
post.commentsom te lezen.post.comments.create(...)om een gekoppeld record toe te voegen.post.comments.countom te tellen.post.comment_idsvoor de id's.
post = Post.find(1)
post.comments.create(body: "First!")
puts post.comments.counthas_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
endVeel-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
endOpties voor afhankelijkheden
Bepaal met dependent wat er met onderliggende records gebeurt wanneer een bovenliggend record wordt verwijderd:
dependent: :destroyverwijdert ook de onderliggende records.dependent: :nullifywist hun vreemde sleutel.dependent: :restrict_with_errorblokkeert het verwijderen.
class Post < ApplicationRecord
has_many :comments, dependent: :destroy
endHet 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
endN+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
endAangepaste 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"
endKennischeck
Toets je begrip van associaties.
Samenvatting: associaties
Je hebt geleerd hoe je modellen aan elkaar koppelt:
belongs_tobevat de vreemde sleutel;has_manyenhas_onevormen de andere kant.has_many throughbeschrijft veel-op-veelrelaties.dependentbepaalt 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.
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.