Cara mendapatkan nilai asli atribut di Rails

96

apakah ada cara untuk mendapatkan nilai asli dari atribut ActiveRecord (= nilai yang dimuat dari database)?

Saya ingin sesuatu seperti ini pada seorang pengamat

before_save object
  do_something_with object.original_name
end

Tugasnya adalah menghapus objek dari tabel hash (sebenarnya, memindahkannya ke kunci lain dalam tabel) saat memperbarui.

Leonid Shevtsov
sumber

Jawaban:

243

Sebelum rel 5.1

Menambahkan _waske atribut Anda akan memberi Anda nilai sebelumnya.

Untuk rel 5.1+

Disalin dari jawaban Lucas Andrade di bawah ini : https://stackoverflow.com/a/50973808/9359123


Menambahkan _wastidak digunakan lagi di rel 5.1, sekarang Anda harus menambahkan_before_last_save

Sesuatu seperti:

before_save object
  do_something_with object.name_before_last_save
end

Akan mengembalikan nilai nama sebelum penyimpanan terakhir Anda di database (berfungsi untuk menyimpan dan membuat)


Perbedaan antara _wasdan _before_last_savemenurut dokumentasi:

_adalah sumber dari dokumen

def attribute_was(attr)
  attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
end

_before_last_save sumber dari dokumen

def attribute_before_last_save(attr_name)
  mutations_before_last_save.original_value(attr_name)
end
Vincent
sumber
7
Misalnya: untuk self.context:self.context_was
Freedom_Ben
2
Dimanakah dokumentasi untuk ini?
j akan
4
dokumentasinya dapat ditemukan di apidock.com/rails/ActiveModel/Dirty/attribute_was
hexinpeter
Dalam dokumentasi, tidak ada peringatan "penghentian" untuk _was.
Rael Gugelmin Cunha
11

Untuk rel 5.1+

Menambahkan _wastidak digunakan lagi di rel 5.1, sekarang Anda harus menambahkan_before_last_save

Sesuatu seperti:

before_save object
  do_something_with object.name_before_last_save
end

Akan mengembalikan nilai nama sebelum penyimpanan terakhir Anda di database (berfungsi untuk menyimpan dan membuat)


Perbedaan antara _wasdan _before_last_savemenurut dokumentasi:

_adalah sumber dari dokumen

def attribute_was(attr)
  attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
end

_before_last_save sumber dari dokumen

def attribute_before_last_save(attr_name)
  mutations_before_last_save.original_value(attr_name)
end

Anda dapat melihat contoh yang lebih baik di sini

Lucas Andrade
sumber
1
attribute_wastelah ditinggalkan untuk mendukung attribute_in_database, sedangkan attribute_before_last_savemetode yang benar-benar baru dari 5.1 yang tidak ada padanannya di versi Rails sebelumnya. Sumber: github.com/rails/rails/pull/25337#issuecomment-225166796
ohaleck