Assosiaatiot
has_many ja belongs_to.
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 commentshas_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
endLuodut metodit
has_many :comments antaa käyttöön kokoelman ja hyödyllisiä metodeja:
post.commentslukemista varten.post.comments.create(...)liitetyn tietueen lisäämistä varten.post.comments.countlukumäärän laskemista varten.post.comment_idstunnuksia varten.
post = Post.find(1)
post.comments.create(body: "First!")
puts post.comments.counthas_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
endMonesta 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
endRiippuvuusasetukset
Määritä dependent-asetuksella, mitä alitietueille tapahtuu, kun ylätietue poistetaan:
dependent: :destroypoistaa myös alitietueet.dependent: :nullifytyhjentää niiden vierasavaimen.dependent: :restrict_with_errorestää poistamisen.
class Post < ApplicationRecord
has_many :comments, dependent: :destroy
endN+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
endN+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
endMukautetut 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"
endPikatarkistus
Testaa, ymmärrätkö assosiaatiot.
Kertaus: assosiaatiot
Opit yhdistämään malleja:
belongs_tosisältää vierasavaimen;has_manyjahas_oneovat suhteen toinen puoli.has_many throughmallintaa monesta moneen -suhteen.dependenthallitsee ketjutettuja poistoja.- Vältä N+1-kyselyitä komennolla
includes.
Seuraavaksi tietojen eheys varmistetaan validoinneilla ja opitaan tekemään kyselyitä.
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.