Saya mencari pendekatan terbaik untuk menghapus catatan dari sebuah tabel. Sebagai contoh, saya memiliki pengguna yang ID pengguna di banyak tabel. Saya ingin menghapus pengguna ini dan setiap catatan yang memiliki ID-nya di semua tabel.
u = User.find_by_name('JohnBoy')
u.usage_indexes.destroy_all
u.sources.destroy_all
u.user_stats.destroy_all
u.delete
Ini berfungsi dan menghapus semua referensi pengguna dari semua tabel, tapi saya dengar destroy_all
itu sangat berat, jadi saya mencoba delete_all
. Itu hanya menghapus pengguna dari tabel penggunanya sendiri dan id
dari semua tabel lainnya dibuat nol, tetapi meninggalkan catatan di dalamnya. Dapatkah seseorang membagikan apa proses yang benar untuk melakukan tugas seperti ini?
Saya melihat bahwa destroy_all
memanggil destroy
fungsi pada semua objek terkait tetapi saya hanya ingin mengkonfirmasi pendekatan yang benar.
sumber
delete_all
, dan 2)destroy_all
instantiate semua record dan hancurkan mereka satu per satu, jadi dengan dataset yang sangat besar, ini bisa sangat lambat.delete_all adalah pernyataan SQL DELETE tunggal dan tidak lebih. destroy_all calls destroy () pada semua hasil yang cocok dari: conditions (jika Anda memilikinya) yang setidaknya NUM_OF_RESULTS pernyataan SQL.
Jika Anda harus melakukan sesuatu yang drastis seperti destr_all () pada dataset besar, saya mungkin tidak akan melakukannya dari aplikasi dan menanganinya secara manual dengan hati-hati. Jika dataset cukup kecil, Anda tidak akan terluka banyak.
sumber
Untuk menghindari fakta yang membuat
destroy_all
instantiate semua record dan menghancurkannya satu per satu, Anda bisa menggunakannya langsung dari kelas model.Jadi alih-alih:
Anda dapat melakukan :
Hasilnya adalah satu permintaan untuk memusnahkan semua catatan terkait
sumber
UsageIndex.destroy_all
setara denganUsageIntex.delete_all
?UsageIndex.destroy_all
tidak lagi tersedia sejak rel 3Saya telah membuat permata kecil yang dapat mengurangi kebutuhan untuk menghapus catatan terkait secara manual dalam beberapa keadaan.
sumber