0Pricing
Ruby Academy · Pelajaran

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 comments

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

Metode yang Dihasilkan

has_many :comments memberi Anda koleksi dengan metode praktis:

  • post.comments untuk membaca.
  • post.comments.create(...) untuk menambahkan rekaman tertaut.
  • post.comments.count untuk menghitung.
  • post.comment_ids untuk memperoleh ID.
post = Post.find(1)
post.comments.create(body: "First!")
puts post.comments.count

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

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

Opsi Ketergantungan

Tentukan apa yang terjadi pada rekaman turunan ketika rekaman induk dihapus dengan dependent:

  • dependent: :destroy juga menghapus rekaman turunan.
  • dependent: :nullify mengosongkan kunci asingnya.
  • dependent: :restrict_with_error menghalangi penghapusan.
class Post < ApplicationRecord
  has_many :comments, dependent: :destroy
end

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

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

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

Pemeriksaan Singkat

Uji pemahaman Anda tentang asosiasi.

Ringkasan: Asosiasi

Anda telah mempelajari cara menghubungkan model:

  • belongs_to menyimpan kunci asing; has_many dan has_one adalah sisi lainnya.
  • has_many through memodelkan relasi banyak-ke-banyak.
  • dependent mengatur 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.

Semua pelajaran dalam kursus ini

  1. Dasar-Dasar Active Record
  2. Migrasi
  3. Asosiasi
  4. Validasi dan Kueri
← Kembali ke Ruby Academy