Ruby Academy · Lektion

Associationer

has_many og belongs_to

Lektion 3 af 413 trin

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 comments

has_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
end

Genererede metoder

En has_many :comments-association giver dig en samling med praktiske metoder:

  • post.comments til at læse.
  • post.comments.create(...) til at tilføje en forbundet post.
  • post.comments.count til at tælle.
  • post.comment_ids til at hente id'erne.
post = Post.find(1)
post.comments.create(body: "First!")
puts post.comments.count

has_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
end

Mange-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
end

Indstillinger for afhængigheder

Afgør med dependent, hvad der sker med børn, når en forælder slettes:

  • dependent: :destroy sletter også børnene.
  • dependent: :nullify rydder deres fremmednøgle.
  • dependent: :restrict_with_error blokerer sletningen.
class Post < ApplicationRecord
  has_many :comments, dependent: :destroy
end

Problemet 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
end

Lø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
end

Tilpassede 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"
end

Hurtigt tjek

Test din forståelse af associationer.

Opsummering: Associationer

Du har lært at forbinde modeller:

  • belongs_to indeholder fremmednøglen; has_many og has_one er den modsatte side.
  • has_many through modellerer mange-til-mange.
  • dependent styrer kaskadesletninger.
  • Undgå N+1-forespørgsler med includes.

Nu sikrer vi dataintegriteten med valideringer og lærer at lave forespørgsler.

Gratis at komme i gang

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.

Alle lektioner i dette kursus

  1. Grundlæggende Active Record
  2. Migrationer
  3. Associationer
  4. Valideringer og forespørgsler
← Tilbage til Ruby Academy