Cara memutakhirkan hers_to agar berfungsi dua kali lebih cepat (database_validations gem)

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') #        SELECT,  ,   `company`  `country`  

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!

Source: https://habr.com/ru/post/id431734/


All Articles