Assosiasjoner
has_many og belongs_to
Assosiasjoner er en gratis leksjon i Ruby Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Ruby Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Ruby Academy inneholder totalt 4 leksjoner.
Hva er assosiasjoner?
Assosiasjoner beskriver relasjoner mellom modeller, slik at Active Record kan navigere mellom relaterte rader for deg. I stedet for å skrive SQL for sammenkoblinger kan du kalle metoder som user.posts.
- De gjenspeiler fremmednøklene i databasen.
- De genererer hjelpemetoder automatisk.
- De gjør at koden leses som domenet den beskriver.
belongs_to
belongs_to betyr at denne modellen inneholder en fremmednøkkel som peker til en annen modell. En Comment som tilhører en Post, har en post_id-kolonne.
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 andre siden: én post eier mange poster av en annen type. En Post har mange Comment-poster. Fremmednøkkelen ligger på «mange»-siden.
class Post < ApplicationRecord
has_many :comments
end
# post.comments returns all related comments
# post.comments.create(body: "Nice!")Hvor fremmednøkkelen ligger
Modellen som bruker belongs_to, inneholder fremmednøkkelen. For Post og Comment har comments-tabellen post_id. Sett dette opp 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
endGenererte metoder
En has_many :comments-assosiasjon gir deg en samling med praktiske metoder:
post.commentsfor å lese.post.comments.create(...)for å legge til en koblet post.post.comments.countfor å telle.post.comment_idsfor å hente id-ene.
post = Post.find(1)
post.comments.create(body: "First!")
puts post.comments.counthas_one
has_one modellerer en én-til-én-kobling, for eksempel en User som har én Profile. Fremmednøkkelen ligger fortsatt på den andre modellen, i profiles.user_id.
class User < ApplicationRecord
has_one :profile
end
class Profile < ApplicationRecord
belongs_to :user
endMange-til-mange med through
For mange-til-mange-relasjoner bruker du en koblingsmodell og has_many through. En Student har mange Course-poster gjennom Enrollment-rader.
class Student < ApplicationRecord
has_many :enrollments
has_many :courses, through: :enrollments
end
class Enrollment < ApplicationRecord
belongs_to :student
belongs_to :course
endAlternativer for dependent
Bestem hva som skal skje med underordnede poster når en overordnet slettes, ved hjelp av dependent:
dependent: :destroysletter også de underordnede postene.dependent: :nullifytømmer fremmednøkkelen deres.dependent: :restrict_with_errorblokkerer slettingen.
class Post < ApplicationRecord
has_many :comments, dependent: :destroy
endN+1-spørringsproblemet
Hvis du går gjennom poster og bruker en assosiasjon, kan det utløses én spørring per post – den beryktede N+1. Hvis du laster inn 10 innlegg og kommentarene deres, kan det kjøres 11 spørringer i stedet for 2.
Dette gjør applikasjoner gradvis tregere uten at det merkes når datamengden vokser.
# N+1: one query per post for comments
Post.all.each do |post|
puts post.comments.count
endLøse N+1 med includes
includes ber Active Record forhåndslaste assosiasjonen med et par spørringer i stedet for mange. Dette er standardløsningen på N+1.
Post.includes(:comments).each do |post|
puts post.comments.count
endEgendefinerte navn med class_name
Når navnet på assosiasjonen ikke samsvarer med modellnavnet, bruker du alternativer som class_name og foreign_key. Et eksempel er en author-assosiasjon som bruker User-modellen.
class Post < ApplicationRecord
belongs_to :author, class_name: "User"
endKort kontroll
Test forståelsen din av assosiasjoner.
Oppsummering: Assosiasjoner
Du har lært hvordan modeller kan relateres:
belongs_toinneholder fremmednøkkelen, menshas_manyoghas_oneer den andre siden.has_many throughmodellerer mange-til-mange-relasjoner.dependentstyrer kaskadesletting.- Unngå N+1-spørringer med
includes.
Deretter skal vi sikre dataintegriteten med valideringer og lære å spørre etter data.
Lær deg Ruby med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 29
- Leksjoner
- 109
Ofte stilte spørsmål
Er leksjonen «Assosiasjoner» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Ruby Academy, inkludert «Assosiasjoner», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Ruby Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Assosiasjoner»?
has_many og belongs_to Du øver på Ruby Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Ruby Academy?
Ingen tidligere erfaring er nødvendig. Ruby Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «Assosiasjoner»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Ruby Academy-leksjonen?
Ja. Alle Ruby Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.