Perlu memeriksa apakah blok atribut telah berubah sebelum memperbarui di Rails 3.
street1, street2, kota, negara bagian, kode pos
Saya tahu saya bisa menggunakan sesuatu seperti
if @user.street1 != params[:user][:street1]
then do something....
end
Tapi sepotong kode itu akan BENAR-BENAR panjang. Apakah ada cara yang lebih bersih?
Ini adalah bagaimana saya memecahkan masalah memeriksa perubahan di banyak atribut.
The
changed
Metode mengembalikan array atribut berubah untuk objek.Keduanya
@user.changed
danattrs
array sehingga saya bisa mendapatkan persimpangan (lihatary & other ary
metode). Hasil persimpangan adalah array. Dengan memanggilany?
array, saya menjadi kenyataan jika setidaknya ada satu persimpangan.Juga sangat berguna,
changed_attributes
metode mengembalikan hash atribut dengan nilai aslinya danchanges
mengembalikan hash atribut dengan nilai asli dan baru (dalam array).Anda dapat memeriksa APIDock untuk versi mana yang mendukung metode ini.
http://apidock.com/rails/ActiveModel/Dirty
sumber
if attrs.any?{|attr| @user.send("#{attr}_changed?")}
Ketika saya ingin memeriksa apakah salah satu dari beberapa atribut berbeda telah berubah - Tentu saja, saya hanya melakukan ini dengan attr yang telah saya tentukan sendiri, karena saya tidak suka melempar params pengguna ke dalam suatusend
metode. ;)ActiveModel::Dirty
tidak bekerja untuk saya karena@model.update_attributes()
menyembunyikan perubahan. Jadi ini adalah bagaimana saya mendeteksi perubahan dalam suatuupdate
metode di controller:Jika Anda mencoba mendeteksi banyak perubahan atribut, itu bisa berantakan. Mungkin tidak seharusnya melakukan ini di controller, tapi meh.
sumber
previous_changes
yang juga tersedia secara default.#update_attributes
tidak menyembunyikan perubahan. Ini menyimpan catatan, sehingga model diperbarui dan tidak ada perubahan. Anda perlu mengubah bidang dalam model dan memeriksachanged?
sebelum Anda menyimpannya. yaitu. @ model.field = 'foo' atau@model.attributes = @model.attributes.merge(params[:model])
Untuk rel 5.1+ callback
Pada Ruby on Rails 5.1, metode
attribute_changed?
danattribute_was
ActiveRecord akan ditinggalkanGunakan
saved_change_to_attribute?
sebagai gantiattribute_changed?
Lebih banyak contoh di sini
sumber
Di atas jawaban lebih baik tetapi untuk pengetahuan kami memiliki pendekatan lain juga, Mari kita nilai kolom 'berubah' untuk objek (@desain),
The .changes akan mengembalikan hash dengan kunci sebagai nama kolom dan nilai-nilai sebagai array dengan dua nilai [old_value, new_value] untuk setiap kolom. Misalnya kategori untuk di atas diubah dari 'ABC' ke 'XYZ' dari @design,
Untuk referensi, ubah ROR
sumber