Asosiasi
has_many dan belongs_to.
Asosiasi adalah pelajaran Ruby Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Ruby Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Ruby Academy mencakup 4 pelajaran total.
Apa Itu Asosiasi?
Asosiasi menyatakan hubungan antar-model agar Active Record dapat menavigasi baris terkait untuk Anda. Daripada menulis SQL penggabungan, Anda memanggil metode seperti user.posts.
- Asosiasi mencerminkan kunci asing dalam basis data Anda.
- Asosiasi secara otomatis menghasilkan metode pembantu.
- Asosiasi membuat kode lebih mencerminkan ranah masalah.
belongs_to
belongs_to menyatakan bahwa model ini menyimpan kunci asing yang menunjuk ke model lain. Comment yang memiliki hubungan belongs_to dengan Post memiliki kolom 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 adalah sisi lainnya: satu rekaman memiliki banyak rekaman dari model lain. Sebuah Post memiliki banyak rekaman Comment. Kunci asing berada di sisi yang memiliki banyak rekaman.
class Post < ApplicationRecord
has_many :comments
end
# post.comments returns all related comments
# post.comments.create(body: "Nice!")Di Mana Kunci Asing Disimpan
Model yang menggunakan belongs_to menyimpan kunci asing. Untuk Post dan Comment, tabel comments memiliki post_id. Siapkan hal ini dalam migrasi dengan t.references :post atau add_reference.
create_table :comments do |t|
t.references :post, foreign_key: true
t.text :body
t.timestamps
endMetode yang Dihasilkan
has_many :comments memberi Anda koleksi dengan metode praktis:
post.commentsuntuk membaca.post.comments.create(...)untuk menambahkan rekaman tertaut.post.comments.countuntuk menghitung.post.comment_idsuntuk memperoleh ID.
post = Post.find(1)
post.comments.create(body: "First!")
puts post.comments.counthas_one
has_one memodelkan hubungan satu-ke-satu, seperti User yang memiliki satu Profile. Kunci asing tetap berada pada model lain (profiles.user_id).
class User < ApplicationRecord
has_one :profile
end
class Profile < ApplicationRecord
belongs_to :user
endRelasi Banyak-ke-Banyak dengan through
Untuk relasi banyak-ke-banyak, gunakan model penghubung dan has_many through. Sebuah Student memiliki banyak rekaman Course melalui baris Enrollment.
class Student < ApplicationRecord
has_many :enrollments
has_many :courses, through: :enrollments
end
class Enrollment < ApplicationRecord
belongs_to :student
belongs_to :course
endOpsi Ketergantungan
Tentukan apa yang terjadi pada rekaman turunan ketika rekaman induk dihapus dengan dependent:
dependent: :destroyjuga menghapus rekaman turunan.dependent: :nullifymengosongkan kunci asingnya.dependent: :restrict_with_errormenghalangi penghapusan.
class Post < ApplicationRecord
has_many :comments, dependent: :destroy
endMasalah Kueri N+1
Mengulang rekaman dan mengakses asosiasi dapat menjalankan satu kueri untuk setiap rekaman, yaitu N+1 yang ditakuti. Memuat 10 postingan lalu komentar terkaitnya dapat menjalankan 11 kueri, bukan 2 kueri.
Hal ini secara diam-diam memperlambat aplikasi seiring bertambahnya data.
# N+1: one query per post for comments
Post.all.each do |post|
puts post.comments.count
endMemperbaiki N+1 dengan includes
includes memberi tahu Active Record untuk memuat asosiasi terlebih dahulu dalam beberapa kueri, bukan banyak kueri. Inilah cara standar untuk memperbaiki N+1.
Post.includes(:comments).each do |post|
puts post.comments.count
endNama Kustom dengan class_name
Jika nama asosiasi tidak cocok dengan modelnya, gunakan opsi seperti class_name dan foreign_key. Misalnya, asosiasi author yang didukung oleh model User.
class Post < ApplicationRecord
belongs_to :author, class_name: "User"
endPemeriksaan Singkat
Uji pemahaman Anda tentang asosiasi.
Ringkasan: Asosiasi
Anda telah mempelajari cara menghubungkan model:
belongs_tomenyimpan kunci asing;has_manydanhas_oneadalah sisi lainnya.has_many throughmemodelkan relasi banyak-ke-banyak.dependentmengatur penghapusan berantai.- Hindari kueri N+1 dengan
includes.
Selanjutnya, kita akan memastikan integritas data dengan validasi dan mempelajari cara membuat kueri.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Asosiasi” gratis?
Ya — teks lengkap “Asosiasi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Ruby Academy, upgrade ke CoddyKit PRO. Kursus Ruby Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Asosiasi”?
has_many dan belongs_to. Kamu berlatih Ruby Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Ruby Academy?
Tidak diperlukan pengalaman sebelumnya. Ruby Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Asosiasi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Ruby Academy ini?
Ya. Setiap pelajaran Ruby Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.