Active Record adalah lapisan yang menghubungkan model Ruby on Rails dengan tabel di database. Kode seperti User.find(1) atau Post.where(published: true) dijalankan oleh Active Record. Memahami cara kerjanya membuat kamu lebih percaya diri saat membangun fitur dan menghindari query yang boros.
Active Record mengikuti pola Active Record pattern, di mana setiap model mewakili satu tabel dan setiap instance mewakili satu baris data. Kamu bisa berinteraksi dengan database lewat objek Ruby tanpa menulis SQL mentah. Ada beberapa konsep yang perlu kamu kuasai agar tidak salah langkah.
Mengenal Active Record dan perannya di Rails
Active Record menangani mapping antara objek Ruby dan tabel database. Setiap model yang mewarisi ApplicationRecord otomatis mendapat banyak method untuk membuat, membaca, mengubah, dan menghapus data. Kamu tidak perlu menulis INSERT, SELECT, atau UPDATE secara manual.
Library ini juga mengelola koneksi database, transaksi, dan migrasi skema. Rails memakai konvensi penamaan: model User terhubung ke tabel users, dan kolom created_at otomatis diisi saat record dibuat. Konvensi ini mempercepat pengembangan karena kamu tidak perlu mengonfigurasi banyak hal.
Pemula sebaiknya memulai dengan CRUD sederhana untuk memahami Active Record. Kamu bisa membaca panduan tips membuat CRUD pertama di Ruby on Rails yang menjelaskan langkah demi langkah.
Asosiasi: menghubungkan antar model
Active Record menyediakan asosiasi untuk mendefinisikan hubungan antar tabel, seperti has_many, belongs_to, dan has_one. Kalau seorang User memiliki banyak Post, tulis has_many :posts di model User dan belongs_to :user di model Post.
Dengan asosiasi, data terkait bisa diakses dengan mudah: user.posts mengembalikan semua post milik user tersebut. Untuk relasi many-to-many, gunakan has_many :through, misalnya Doctor punya banyak Patient lewat Appointment.
Ada opsi seperti dependent: :destroy untuk menghapus data terkait saat parent dihapus, dan inverse_of untuk menghindari query berulang. Asosiasi yang tepat membuat kode lebih ekspresif dan mengurangi query N+1.
Validasi: menjaga integritas data
Active Record memungkinkan kamu menambahkan validasi di level model sebelum data disimpan ke database. Validasi umum seperti presence, uniqueness, length, dan format memastikan data yang masuk sesuai aturan bisnis.
Validasi di model tidak menggantikan constraint di database, jadi sebaiknya kombinasikan keduanya. Tambahkan indeks unik pada kolom email di migrasi, lalu validasi uniqueness di model untuk pengalaman pengguna yang lebih baik. Validasi model bisa dilewati dengan method seperti update_column, jadi database tetap menjadi garda terakhir.
Query efisien dengan Active Record
Active Record menyediakan API query yang kuat, mulai dari where, order, limit, hingga joins dan includes. Untuk menghindari masalah N+1, gunakan includes saat mengambil data terkait yang akan dipakai. Contoh: Post.includes(:comments).where(published: true) memuat komentar dalam satu query tambahan, bukan satu per post.
Manfaatkan scope untuk membungkus query yang sering dipakai. Scope membuat kode lebih rapi dan mudah dibaca, misalnya scope :published, -> { where(published: true) }. Kamu juga bisa menggabungkan scope dengan metode query lain.
Saat bekerja dengan data besar, gunakan find_each untuk iterasi batch, bukan all.each yang memuat semua record ke memori. Untuk query kompleks, SQL mentah dengan find_by_sql kadang lebih efisien, tapi pakailah secara bijak.
Jika kamu ingin memperdalam pengelolaan database di Rails, baca tips mengelola database di Ruby on Rails untuk pemula yang membahas migrasi dan optimasi.
Callback: mengatur alur eksekusi
Callback menjalankan kode pada momen tertentu dalam siklus hidup objek, seperti before_save, after_create, atau before_destroy. Callback berguna untuk normalisasi data, mengirim notifikasi, atau memperbarui cache.
Callback yang terlalu banyak membuat alur sulit dilacak. Gunakan callback untuk hal-hal yang memang terkait erat dengan model, dan pertimbangkan service object atau background job untuk tugas yang lebih kompleks. Baca juga panduan memahami callback di Ruby on Rails agar tidak terjebak.
Migrasi dan skema database
Active Record menyediakan migrasi untuk mengubah skema database secara versioned. Setiap migrasi adalah file Ruby yang mendefinisikan perubahan, seperti membuat tabel atau menambah kolom. Rails melacak migrasi yang sudah dijalankan di tabel schema_migrations.
Dengan migrasi, tim bisa berkolaborasi tanpa saling menimpa perubahan database. Jalankan rails db:migrate untuk menerapkan migrasi, dan rails db:rollback untuk membatalkan. Pastikan migrasi selalu reversible agar aman saat rollback.
Kesalahan umum dan cara menghindarinya
- N+1 query: gunakan
includesataupreloaduntuk memuat asosiasi. - Validasi ganda: kombinasikan validasi model dengan constraint database.
- Callback berlebihan: pindahkan logika kompleks ke service object.
- Query tanpa indeks: tambahkan indeks pada kolom yang sering dipakai di
whereatauorder. - Mengabaikan transaksi: bungkus operasi yang melibatkan banyak tabel dalam
transaction.
Untuk performa aplikasi secara keseluruhan, kamu bisa menerapkan tips meningkatkan performa aplikasi Ruby on Rails yang mencakup optimasi query dan caching.
Jika aplikasimu juga menggunakan PHP dan JavaScript, hindari kesalahan umum saat menggabungkan PHP dan JavaScript di halaman web yang bisa memengaruhi integrasi frontend-backend. Saat mengambil nilai input dengan jQuery, pahami perbedaan cara memilih antara val(), attr(), atau prop() agar kode JavaScript-mu tidak bermasalah.
Kalau kamu ingin menyaksikan pertandingan basket, sepakbola, atau UFC secara gratis dengan host yang menghibur, kunjungi tarkamlive.com sebagai alternatif hiburan saat istirahat ngoding.
Ringkasan
Active Record adalah fondasi interaksi database di Rails. Dengan memahami asosiasi, validasi, query efisien, callback, dan migrasi, kamu bisa menulis kode yang lebih bersih dan aplikasi yang lebih cepat. Latih kemampuan ini lewat proyek nyata dan baca dokumentasi resmi Rails.
Pertanyaan yang Sering Diajukan
Apa perbedaan Active Record dan ORM biasa?
Active Record adalah implementasi pola Active Record, di mana setiap model mewakili tabel dan instance mewakili baris. ORM biasa mungkin menggunakan pola Data Mapper yang memisahkan objek dari database. Active Record Rails menggabungkan domain logic dan persistence dalam satu kelas.
Kapan sebaiknya menggunakan SQL mentah di Active Record?
Gunakan SQL mentah saat query terlalu kompleks untuk API Active Record, misalnya melibatkan window function atau subquery rumit. Prioritaskan API ActiveRecord untuk menjaga keterbacaan dan keamanan dari SQL injection.
Bagaimana cara mengatasi error N+1 query?
Gunakan method includes, preload, atau eager_load untuk memuat asosiasi yang akan dipakai. Pantau query dengan gem seperti bullet yang memberi peringatan saat terjadi N+1.
