#New_record? fungsi menentukan apakah rekaman telah disimpan. Tapi itu selalu salah after_save
. Apakah ada cara untuk menentukan apakah record tersebut adalah record yang baru dibuat atau yang lama dari update?
Saya berharap untuk tidak menggunakan callback lain seperti before_create
menyetel bendera dalam model atau memerlukan kueri lain ke db.
Setiap saran dihargai.
Sunting: Perlu menentukannya dalam after_save
kaitan, dan untuk kasus penggunaan khusus saya, tidak ada updated_at
atau updated_on
cap waktu
ruby-on-rails
activerecord
activemodel
Aaron Qian
sumber
sumber
Jawaban:
Saya ingin menggunakan ini untuk
after_save
panggilan balik.Solusi yang lebih sederhana adalah dengan menggunakan
id_changed?
(karena tidak akan berubahupdate
) atau bahkancreated_at_changed?
jika kolom stempel waktu ada.Pembaruan: Seperti yang ditunjukkan @mitsy, jika pemeriksaan ini diperlukan di luar panggilan balik, maka gunakan
id_previously_changed?
. Lihat dokumen .sumber
after_save
.id_changed?
akan menjadi false setelah record disimpan (setidaknya di luar hook). Dalam hal ini, Anda dapat menggunakanid_previously_changed?
Tidak ada sihir rel di sini yang saya tahu, Anda harus melakukannya sendiri. Anda dapat membersihkannya menggunakan atribut virtual ...
Di kelas model Anda:
sumber
Namun pilihan lain, bagi mereka yang melakukan memiliki
updated_at
timestamp:sumber
created_at
menyamakanupdated_at
dalamafter_save
panggilan balik kapan saja selain saat pertama kali dibuat?"created_at
danupdated_at
akan sama dalamafter_save
callback. Dalam semua situasi lain, mereka tidak akan sama diafter_save
callback.Ada
after_create
callback yang hanya dipanggil jika recordnya adalah record baru, setelah disimpan . Ada jugaafter_update
panggilan balik untuk digunakan jika ini adalah catatan yang sudah ada yang diubah dan disimpan. Theafter_save
callback disebut dalam kedua kasus, setelah baikafter_create
atauafter_update
disebut.Menggunakan
after_create
jika Anda membutuhkan sesuatu untuk terjadi sekali setelah record baru disimpan.Info lebih lanjut di sini: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
sumber
Karena objek telah disimpan, Anda perlu melihat perubahan sebelumnya. ID hanya boleh berubah setelah dibuat.
Ada juga variabel contoh
@new_record_before_save
. Anda dapat mengaksesnya dengan melakukan hal berikut:Keduanya sangat jelek, tetapi memungkinkan Anda mengetahui apakah objek tersebut baru dibuat. Semoga membantu!
sumber
after_save
panggilan balik menggunakan Rails 4 dan tak satu pun dari ini bekerja untuk mengidentifikasi rekor baru ini.@object.previous_changes[:id].any?
cukup sederhana dan elegan. Ini berfungsi untuk saya setelah record diperbarui (saya tidak menyebutnya dariafter_save
).@object.id_previously_changed?
sedikit kurang jelek.after_save
Rails 4 yang ingin Anda lihat,changes[:id]
bukanprevious_changes[:id]
. Namun ini berubah di Rails5.1 (lihat diskusi di github.com/rails/rails/pull/25337 )previous_changes.key?(:id)
untuk pemahaman yang lebih baik.Rails 5.1+ cara:
sumber
Untuk Rails 4 (diperiksa pada 4.2.11.1) hasil
changes
danprevious_changes
metode adalah hash kosong{}
pada pembuatan objek di dalamnyaafter_save
. Jadiattribute_changed?
metode sepertiid_changed?
tidak akan berfungsi seperti yang diharapkan.Tetapi Anda dapat memanfaatkan pengetahuan ini dan - mengetahui bahwa setidaknya 1 atribut harus dalam
changes
pembaruan - periksa apakahchanges
kosong. Setelah Anda mengonfirmasi bahwa itu kosong, Anda harus selama pembuatan objek:sumber
Saya suka lebih spesifik bahkan saya sadar itu
:id
seharusnya tidak berubah secara normal, tetapiSelalu lebih murah untuk menjadi spesifik daripada menemukan bug tak terduga yang sangat aneh.
Sama halnya jika saya mengharapkan
true
flag dari argumen yang tidak dapat dipercayaIni menghemat banyak waktu untuk tidak duduk di atas serangga aneh.
sumber