Saya tahu ini mungkin ada di Internet di suatu tempat tetapi saya tidak dapat menemukan jawabannya di sini di Stackoverflow jadi saya pikir saya dapat sedikit meningkatkan basis pengetahuan di sini.
Saya seorang pemula di Ruby and Rails tetapi perusahaan saya cukup berinvestasi di dalamnya jadi saya mencoba untuk mengetahuinya dengan sedikit lebih detail.
Sulit bagi saya untuk mengubah pola pikir saya untuk merancang aplikasi dari "model" bukan dari database, jadi saya mencoba mencari tahu bagaimana melakukan semua pekerjaan desain yang telah saya lakukan secara klasik di Database di Model rel sebagai gantinya.
Jadi tugas terbaru yang saya berikan kepada diri saya sendiri adalah mencari cara untuk mengonfigurasi model database Rails untuk melakukan penghapusan bertingkat? Adakah cara mudah untuk melakukan ini? Atau apakah saya harus masuk ke MySql dan mengaturnya?
sumber
:delete_all
dan:destroy
untuk ini. Keduanya akan menyebabkan keanggotaan turunan (1 tingkat untuk dihapus [rujukan?] Dann
untuk penghancuran (jika turunannya memiliki ketergantungan penghancuran)) untuk dihapus dari database, tetapi:destroy
akan membuat instance setiap objek turunan dan menjalankan panggilan balik apa pun terlebih dahulu, sedangkan:delete_all
akan langsung menjalankan Pernyataan SQL DELETE dalam database.:destroy
lebih lambat karena itu, tetapi memungkinkan Anda memiliki callback saat record dimusnahkan. Mengakali Rails di satu sisi dan potensi instansiasi n ^ x di sisi lain.Ya Anda bisa, jika Anda menggunakan hubungan seperti has_many Anda hanya melakukan ini
has_many :memberships, dependent: :destroy
sumber
Bertentangan dengan jawaban yang diberikan, saya sangat menyarankan juga melakukan ini pada level database. Jika Anda memiliki proses yang berbeda atau lingkungan multi utas, hal itu bisa terjadi karena rekaman tidak dihapus dengan benar. Selain itu, kunci asing database membuat segalanya menjadi lebih cepat saat menghapus banyak data.
Seperti dalam jawaban yang disarankan, lakukan ini:
has_many :memberships, dependent: :delete_all
Namun juga pastikan untuk menyiapkan
foreign_key
dalam migrasi. Dengan cara itu database menangani penghapusan catatan secara otomatis untuk Anda.Untuk membatalkan nilai ketika keanggotaan dihapus, dengan asumsi Anda memiliki model pengguna:
add_foreign_key :users, :memberships, on_delete: :nullify
Anda juga dapat menghapus semua model setiap kali keanggotaan dihapus
add_foreign_key :users, :memberships, on_delete: :cascade
sumber
delete_all
dalam model. Kunci asing akan menangani penghapusan semuanya dengan benar untuk Anda di tingkat database.Ingatlah bahwa delete_all tidak akan menjalankan callback apa pun (seperti before_destroy dan after_destroy) pada rekaman anak.
sumber
Sepertinya plugin ini mungkin memberi Anda apa yang Anda cari jika Anda ingin penghapusan berjenjang tercermin dalam struktur database yang sebenarnya:
http://www.redhillonrails.org/foreign_key_migrations.html
Format untuk menggunakan ini dalam migrasi akan menjadi seperti ini:
create_table :orders do |t| t.column :customer_id, :integer, :on_delete => :set_null, :on_update => :cascade ... end
sumber