Ruby Academy · leksjon

Assosiasjoner

has_many og belongs_to

Leksjon 3 av 413 trinn

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 comments

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

Genererte metoder

En has_many :comments-assosiasjon gir deg en samling med praktiske metoder:

  • post.comments for å lese.
  • post.comments.create(...) for å legge til en koblet post.
  • post.comments.count for å telle.
  • post.comment_ids for å hente id-ene.
post = Post.find(1)
post.comments.create(body: "First!")
puts post.comments.count

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

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

Alternativer for dependent

Bestem hva som skal skje med underordnede poster når en overordnet slettes, ved hjelp av dependent:

  • dependent: :destroy sletter også de underordnede postene.
  • dependent: :nullify tømmer fremmednøkkelen deres.
  • dependent: :restrict_with_error blokkerer slettingen.
class Post < ApplicationRecord
  has_many :comments, dependent: :destroy
end

N+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
end

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

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

Kort kontroll

Test forståelsen din av assosiasjoner.

Oppsummering: Assosiasjoner

Du har lært hvordan modeller kan relateres:

  • belongs_to inneholder fremmednøkkelen, mens has_many og has_one er den andre siden.
  • has_many through modellerer mange-til-mange-relasjoner.
  • dependent styrer kaskadesletting.
  • Unngå N+1-spørringer med includes.

Deretter skal vi sikre dataintegriteten med valideringer og lære å spørre etter data.

Gratis å komme i gang

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.

Alle leksjonene i dette kurset

  1. Grunnleggende Active Record
  2. Migreringer
  3. Assosiasjoner
  4. Valideringer og spørringer
← Tilbake til Ruby Academy