Associationer
has_many og belongs_to
Associationer er en gratis Ruby Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Ruby Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Ruby Academy-kurset indeholder 4 lektioner i alt.
Hvad er associationer?
Associationer erklærer relationer mellem modeller, så Active Record kan navigere mellem relaterede rækker for dig. I stedet for at skrive SQL med JOIN kalder du metoder som user.posts.
- De afspejler fremmednøglerne i din database.
- De genererer automatisk hjælpemetoder.
- De får koden til at ligne domænet.
belongs_to
belongs_to angiver, at denne model indeholder en fremmednøgle, der peger på en anden. En Comment, der tilhører en Post, har en kolonne med navnet 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 er den anden side: én post ejer mange poster af en anden type. En Post har mange Comment-poster. Fremmednøglen ligger på mange-siden.
class Post < ApplicationRecord
has_many :comments
end
# post.comments returns all related comments
# post.comments.create(body: "Nice!")Hvor ligger fremmednøglen?
Den model, der bruger belongs_to, indeholder fremmednøglen. For Post og Comment har tabellen comments en kolonne med navnet post_id. Konfigurér dette i en migrering med t.references :post eller add_reference.
create_table :comments do |t|
t.references :post, foreign_key: true
t.text :body
t.timestamps
endGenererede metoder
En has_many :comments-association giver dig en samling med praktiske metoder:
post.commentstil at læse.post.comments.create(...)til at tilføje en forbundet post.post.comments.counttil at tælle.post.comment_idstil at hente id'erne.
post = Post.find(1)
post.comments.create(body: "First!")
puts post.comments.counthas_one
has_one modellerer en en-til-en-forbindelse, f.eks. en User, der har én Profile. Fremmednøglen ligger stadig på den anden model (profiles.user_id).
class User < ApplicationRecord
has_one :profile
end
class Profile < ApplicationRecord
belongs_to :user
endMange-til-mange med through
Ved mange-til-mange skal du bruge en forbindelsesmodel og has_many through. En Student har mange Course-poster gennem rækker i Enrollment.
class Student < ApplicationRecord
has_many :enrollments
has_many :courses, through: :enrollments
end
class Enrollment < ApplicationRecord
belongs_to :student
belongs_to :course
endIndstillinger for afhængigheder
Afgør med dependent, hvad der sker med børn, når en forælder slettes:
dependent: :destroysletter også børnene.dependent: :nullifyrydder deres fremmednøgle.dependent: :restrict_with_errorblokerer sletningen.
class Post < ApplicationRecord
has_many :comments, dependent: :destroy
endProblemet med N+1-forespørgsler
Hvis du gennemløber poster og tilgår en association, kan der blive sendt én forespørgsel pr. post – den frygtede N+1. Hvis du indlæser 10 indlæg og derefter deres kommentarer, kan det give 11 forespørgsler i stedet for 2.
Det gør applikationer langsommere uden at det er tydeligt, efterhånden som datamængden vokser.
# N+1: one query per post for comments
Post.all.each do |post|
puts post.comments.count
endLøs N+1 med includes
includes fortæller Active Record, at associationen skal forhåndsindlæses med et par forespørgsler i stedet for mange. Det er standardløsningen på N+1.
Post.includes(:comments).each do |post|
puts post.comments.count
endTilpassede navne med class_name
Når associationsnavnet ikke matcher modellen, skal du bruge indstillinger som class_name og foreign_key. Det kan f.eks. være en author-association, der bygger på modellen User.
class Post < ApplicationRecord
belongs_to :author, class_name: "User"
endHurtigt tjek
Test din forståelse af associationer.
Opsummering: Associationer
Du har lært at forbinde modeller:
belongs_toindeholder fremmednøglen;has_manyoghas_oneer den modsatte side.has_many throughmodellerer mange-til-mange.dependentstyrer kaskadesletninger.- Undgå N+1-forespørgsler med
includes.
Nu sikrer vi dataintegriteten med valideringer og lærer at lave forespørgsler.
Lær Ruby med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 29
- Lektioner
- 109
Ofte stillede spørgsmål
Er lektionen “Associationer” gratis?
Ja — alle 3 lektioner i læringssporet Ruby Academy, inklusive “Associationer”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Ruby Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Associationer”?
has_many og belongs_to Du øver dig i Ruby Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Ruby Academy?
Der kræves ingen tidligere erfaring. Ruby Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Associationer”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Ruby Academy-lektion?
Ja. Alle Ruby Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.