Rel 5.1+
class Page < ActiveRecord::Base
before_save :do_something, if: :will_save_change_to_status_id?
private
def do_something
end
end
Komit yang mengubah ActiveRecord :: Dirty ada di sini: https://github.com/rails/rails/commit/16ae3db5a5c6a08383b974ae6c96faac5b4a3c81
Berikut adalah entri blog tentang perubahan ini: https://www.ombulabs.com/blog/rails/upgrades/active-record-5-1-api-changes.html
Berikut adalah ringkasan yang saya buat untuk diri saya sendiri tentang perubahan pada ActiveRecord :: Dirty in Rails 5.1+:
ActiveRecord :: Kotor
https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Dirty.html
Sebelum Menyimpan (PERUBAHAN OPSIONAL)
Setelah memodifikasi objek dan sebelum menyimpan ke database, atau di dalam before_save
filter:
changes
seharusnya sekarang changes_to_save
changed?
seharusnya sekarang has_changes_to_save?
changed
seharusnya sekarang changed_attribute_names_to_save
<attribute>_change
seharusnya sekarang <attribute>_change_to_be_saved
<attribute>_changed?
seharusnya sekarang will_save_change_to_<attribute>?
<attribute>_was
seharusnya sekarang <attribute>_in_database
Setelah Menyimpan (BREAKING CHANGE)
Setelah memodifikasi objek dan setelah menyimpan ke database, atau di dalam after_save
filter:
saved_changes
(menggantikan previous_changes
)
saved_changes?
saved_change_to_<attribute>
saved_change_to_<attribute>?
<attribute>_before_last_save
Rel <= 5.0
class Page < ActiveRecord::Base
before_save :do_something, if: :status_id_changed?
private
def do_something
end
end
Ini memanfaatkan fakta bahwa before_save
callback dapat dieksekusi secara bersyarat berdasarkan nilai kembalian dari panggilan metode. The status_id_changed?
Metode berasal dari ActiveModel :: Kotor , yang memungkinkan kita untuk memeriksa apakah atribut tertentu telah berubah dengan hanya menambahkan _changed?
untuk nama atribut.
Kapan do_something
metode harus dipanggil sesuai dengan kebutuhan Anda. Bisa jadi before_save
atau after_save
salah satu dari ActiveRecord :: Callbacks yang ditentukan .
Ini
attribute_changed?
tidak digunakan lagi di Rails 5.1, sekarang gunakan sajawill_save_change_to_attribute?
.Untuk informasi lebih lanjut, lihat masalah ini .
sumber
Coba ini
after_validation :do_something, if: ->(obj){ obj.status_id.present? and obj.status_id_changed? } def do_something # your code end
Referensi - http://apidock.com/rails/ActiveRecord/Dirty
sumber