Ruby Academy · Oppitunti

Assosiaatiot

has_many ja belongs_to.

Oppitunti 3/413 vaihetta

Assosiaatiot on ilmainen Ruby Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Ruby Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Ruby Academy-kurssilla on yhteensä 4 oppituntia.

Mitä assosiaatiot ovat?

Assosiaatiot ilmoittavat mallien väliset suhteet, jotta Active Record voi siirtyä liittyviin riveihin puolestasi. Liitos-SQL:n kirjoittamisen sijaan voit kutsua metodeja, kuten user.posts.

  • Ne vastaavat tietokannan vierasavaimia.
  • Ne luovat apumetodeja automaattisesti.
  • Ne saavat koodin näyttämään sovellusalueen kieleltä.

belongs_to

belongs_to tarkoittaa, että tämä malli sisältää toiseen malliin osoittavan vierasavaimen. Comment, joka kuuluu Post-malliin, sisältää sarakkeen 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 on suhteen toinen puoli: yksi tietue liittyy useaan toisen mallin tietueeseen. Post-mallilla on useita Comment-tietueita. Vierasavain sijaitsee monen puolella.

class Post < ApplicationRecord
  has_many :comments
end

# post.comments returns all related comments
# post.comments.create(body: "Nice!")

Vierasavaimen sijainti

belongs_to-määrityksen sisältävä malli sisältää vierasavaimen. Post- ja Comment-malleissa comments-taulu sisältää sarakkeen post_id. Määritä tämä migraatiossa komennolla t.references :post tai add_reference.

create_table :comments do |t|
  t.references :post, foreign_key: true
  t.text :body
  t.timestamps
end

Luodut metodit

has_many :comments antaa käyttöön kokoelman ja hyödyllisiä metodeja:

  • post.comments lukemista varten.
  • post.comments.create(...) liitetyn tietueen lisäämistä varten.
  • post.comments.count lukumäärän laskemista varten.
  • post.comment_ids tunnuksia varten.
post = Post.find(1)
post.comments.create(body: "First!")
puts post.comments.count

has_one

has_one mallintaa yksi-yhteen-suhdetta, kuten User-mallia, jolla on yksi Profile. Vierasavain sijaitsee edelleen toisessa mallissa (profiles.user_id).

class User < ApplicationRecord
  has_one :profile
end

class Profile < ApplicationRecord
  belongs_to :user
end

Monesta moneen through-määrityksellä

Monesta moneen -suhteessa käytetään liitosmallia ja määritystä has_many through. Student-mallilla on useita Course-tietueita Enrollment-rivien kautta.

class Student < ApplicationRecord
  has_many :enrollments
  has_many :courses, through: :enrollments
end

class Enrollment < ApplicationRecord
  belongs_to :student
  belongs_to :course
end

Riippuvuusasetukset

Määritä dependent-asetuksella, mitä alitietueille tapahtuu, kun ylätietue poistetaan:

  • dependent: :destroy poistaa myös alitietueet.
  • dependent: :nullify tyhjentää niiden vierasavaimen.
  • dependent: :restrict_with_error estää poistamisen.
class Post < ApplicationRecord
  has_many :comments, dependent: :destroy
end

N+1-kyselyongelma

Tietueiden läpikäynti ja assosiaation käsittely voi käynnistää yhden kyselyn jokaista tietuetta kohden, eli pelätyn N+1-ongelman. Kun 10 postausta ja niiden kommentit ladataan, kyselyitä voidaan suorittaa 11 kahden sijaan.

Tämä hidastaa sovelluksia huomaamatta datan määrän kasvaessa.

# N+1: one query per post for comments
Post.all.each do |post|
  puts post.comments.count
end

N+1-ongelman korjaaminen includes-menetelmällä

includes käskee Active Recordia lataamaan assosiaation ennakkoon muutamalla kyselyllä useiden kyselyiden sijaan. Tämä on tavallinen ratkaisu N+1-ongelmaan.

Post.includes(:comments).each do |post|
  puts post.comments.count
end

Mukautetut nimet class_name-asetuksella

Kun assosiaation nimi ei vastaa mallia, käytä asetuksia, kuten class_name ja foreign_key. Esimerkiksi author-assosiaatio voi perustua User-malliin.

class Post < ApplicationRecord
  belongs_to :author, class_name: "User"
end

Pikatarkistus

Testaa, ymmärrätkö assosiaatiot.

Kertaus: assosiaatiot

Opit yhdistämään malleja:

  • belongs_to sisältää vierasavaimen; has_many ja has_one ovat suhteen toinen puoli.
  • has_many through mallintaa monesta moneen -suhteen.
  • dependent hallitsee ketjutettuja poistoja.
  • Vältä N+1-kyselyitä komennolla includes.

Seuraavaksi tietojen eheys varmistetaan validoinneilla ja opitaan tekemään kyselyitä.

Aloita maksutta

Opi Ruby tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
29
Oppitunnit
109

Usein kysytyt kysymykset

Onko oppitunti ”Assosiaatiot” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Ruby Academy-oppimispolun 3 oppituntia, myös oppitunnin “Assosiaatiot”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Ruby Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Assosiaatiot”?

has_many ja belongs_to. Harjoittelet Ruby Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Ruby Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Ruby Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Assosiaatiot”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Ruby Academy-oppitunnilla?

Kyllä. Jokainen Ruby Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Active Recordin perusteet
  2. Migraatiot
  3. Assosiaatiot
  4. Validoinnit ja kyselyt
← Takaisin: Ruby Academy