Setelah beberapa waktu dari awal pengembangan proyek Anda, Anda mungkin memperhatikan bahwa Anda memiliki ketidakkonsistenan antara batasan dalam database dan validasi dalam aplikasi. Pada artikel ini, saya menjelaskan bagaimana gem
database_consistency akan membantu Anda merapikan basis data Anda.
Kami membahas dua kemungkinan situasi. Kode contoh ditulis untuk
ActiveRecord .
Situasi pertama
Misalkan Anda memiliki tabel yang disajikan sebagai berikut:
create_table :users do |t| t.string :name end
dan sebuah kelas dinyatakan sebagai:
class User < ApplicationRecord validates :name, presence: true end
Dalam hal ini, validasi dapat diabaikan dengan menggunakan metode seperti:
save(validate: false)
dan, sebagai hasilnya, nilai
NULL akan disimpan dalam database. Dalam
kebanyakan kasus, Anda tidak ingin ini terjadi (karena Anda menginstal validasi). Dengan demikian, akan lebih tepat untuk memiliki batasan yang tidak nol dalam database.
create_table :users do |t| t.string :name, null: false end
Situasi kedua (terbalik)
Misalkan Anda memiliki tabel yang disajikan sebagai berikut:
create_table :users do |t| t.string :name, null: false end
dan sebuah kelas dinyatakan sebagai:
class User < ApplicationRecord validates :name end
Dalam hal ini,
valid?
akan mengembalikan
true
untuk catatan yang tidak dapat disimpan. Selain itu, upaya untuk menyimpan catatan seperti itu dalam database akan dieksekusi dari satu ke beberapa query SQL dan pada akhirnya akan mengembalikan kesalahan, sambil mengembalikan seluruh transaksi. Semua manipulasi ini tidak efisien dan dapat dengan mudah diselesaikan dengan menambahkan
presence: true
validasi
presence: true
. Dalam kebanyakan kasus, Anda harus menambahkan validasi ini.
Pertanyaan muncul di depan saya: bagaimana menemukan semua kasus seperti itu secara otomatis?
Saya mempersembahkan kepada Anda
database_consistency permata saya. Saat ini, ia mendeteksi sebagian besar kasus. Sebagai bonus kecil, ia juga akan memberi tahu Anda situasi di mana dimungkinkan untuk menyimpan catatan dengan nilai
NULL dalam kolom dengan batasan tidak nol.
Beberapa pertanyaan tetap terbuka:
- Apa peluang lain untuk diterapkan?
- Apakah ada kebutuhan untuk mendukung ORM lain seperti sekuel ?
Cobalah sendiri dan bagikan umpan balik Anda. Saya akan berterima kasih atas kontribusi apa pun!