Pada artikel ini, saya akan menunjukkan mengapa Anda perlu menggunakan db_belongs_to
dari db_belongs_to
database_validations bukan milik belongs_to
.
Saya yakin sebagian besar dari Anda sudah familiar dengan belongs_to
dari ORM ActiveRecord . Tapi tahukah Anda bahwa menginisialisasi koneksi menggunakan belongs_to
dalam model Anda juga menambahkan validasi terhadap keberadaan koneksi. Ini karena belongs_to
memiliki optional: false
opsi optional: false
secara default.
Jadi, setiap kali Anda menyimpan objek baru atau memperbarui yang sudah ada, Anda menjalankan kueri SQL SELECT tambahan untuk setiap tautan Anda.
Contoh
class User < ActiveRecord::Base belongs_to :company belongs_to :country end user = User.first user.update(some_field: 'something')
Anda juga harus menyadari bahwa pendekatan ini tidak menjamin integritas basis data tautan dapat dihapus nanti (dalam permintaan berikutnya atau paralel) tanpa masalah.
user.update(...) user.company.destroy! => , , , ( )
Untuk mengatasi masalah ini, Anda bisa menambahkan batasan kunci asing terkait ke database Anda. Dengan batasan ini, Anda akan selalu yakin bahwa koneksi ini ada.
Bagaimana dengan kinerja? Mengapa kita perlu membuat query SELECT ke database jika kita sudah yakin bahwa integritas data akan dipertahankan (menggunakan batasan kunci asing)?
Jawabannya sederhana - tidak perlu. Tetapi untuk memungkinkan ini, kita perlu memecahkan masalah penanganan pengecualian ActiveRecord::InvalidForeignKey
, yang kita dapatkan ketika kita mencoba untuk menyimpan koneksi yang hilang dalam database. Ini diperlukan untuk memiliki perilaku yang sama dengan belongs_to
, sehingga errors
termasuk errors
yang sama.
Agar Anda tidak menulis sendiri semua pemrosesan, permata database_validations akan berguna. Permata ini sudah termasuk validates_db_uniqueness_of
, yang disukai orang ( pos di hub ) dan sekarang memiliki db_belongs_to
, yang sangat mudah diimplementasikan dalam proyek Anda. db_belongs_to
meningkatkan kinerja dan memastikan integritas data.
Metode ini melakukan beberapa hal untuk Anda:
- Memeriksa adanya batasan kunci asing yang benar dalam database selama startup aplikasi;
- Parses basis data pengecualian dan memberikan kesalahan yang sesuai untuk
errors
objek Anda; - Menghilangkan kebutuhan untuk mengeksekusi query SQL tambahan ke database;
Saya sarankan Anda menggunakan database_validations dalam proyek Anda. Permata ini telah diuji di lingkungan produksi dan telah terbukti sangat baik. Meskipun mudah diimplementasikan, ini dapat sangat meningkatkan kinerja proyek Anda semakin banyak Anda menggunakannya, semakin banyak Anda menghemat , lihat tolok ukur grup untuk detail.
Umpan balik apapun diterima! Kami berterima kasih atas segala kontribusi untuk proyek ini!