Pertanyaan Cara menentukan apakah rekaman baru dibuat atau diperbarui di after_save


#New_record? fungsi menentukan apakah catatan telah disimpan. Tapi itu selalu salah dalam after_save menghubungkan. Apakah ada cara untuk menentukan apakah rekaman adalah catatan yang baru dibuat atau yang lama dari pembaruan?

Saya berharap tidak menggunakan callback lain seperti before_create untuk menetapkan bendera dalam model atau meminta kueri lain ke dalam db.

Saran apa pun dihargai.

Edit: Perlu ditentukan after_save hook, dan untuk kasus penggunaan khusus saya, tidak ada updated_at atau updated_on cap waktu


75
2018-02-11 23:30


asal


Jawaban:


Saya ingin menggunakan ini untuk sebuah after_save panggilan balik.

Solusi yang lebih sederhana adalah menggunakan id_changed? (Karena itu tidak akan berubah update) atau bahkan created_at_changed? jika ada kolom stempel waktu.

Perbarui: Seperti yang ditunjukkan @mitsy, jika pemeriksaan ini diperlukan di luar callback kemudian gunakan id_previously_changed?. Lihat dokumen.


139
2017-08-25 00:41



Tidak ada sihir rel di sini yang saya ketahui, Anda harus melakukannya sendiri. Anda bisa membersihkan ini menggunakan atribut virtual ...

Di kelas model Anda:

def before_save
  @was_a_new_record = new_record?
  return true
end

def after_save
  if @was_a_new_record
    ...
  end
end

28
2018-02-12 00:58



Namun pilihan lain, bagi mereka yang melakukan punya updated_at cap waktu:

if created_at == updated_at
  # it's a newly created record
end

21
2018-02-05 00:28



Ada sebuah after_create panggilan balik yang hanya dipanggil jika rekaman adalah catatan baru, setelah itu disimpan. Ada juga sebuah after_update panggilan balik untuk digunakan jika ini adalah catatan yang sudah ada yang diubah dan disimpan. Itu after_save panggilan balik disebut dalam kedua kasus, setelah keduanya after_create atau after_update disebut.

Menggunakan after_create jika Anda membutuhkan sesuatu untuk terjadi satu kali setelah catatan baru disimpan.

Info lebih lanjut di sini: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html


19
2017-11-28 21:25



Karena objek telah disimpan, Anda perlu melihat perubahan sebelumnya. ID hanya harus berubah setelah membuat.

# true if this is a new record
@object.previous_changes[:id].any?

Ada juga variabel instan @new_record_before_save. Anda dapat mengaksesnya dengan melakukan hal berikut:

# true if this is a new record
@object.instance_variable_get(:@new_record_before_save)

Keduanya sangat jelek, tetapi mereka akan memungkinkan Anda untuk mengetahui apakah objek tersebut baru dibuat. Semoga itu membantu!


12
2017-09-15 17:36