Rails'de bir özniteliğin orijinal değeri nasıl elde edilir


96

ActiveRecord özniteliğinin orijinal değerini (= veritabanından yüklenen değer) almanın bir yolu var mı?

Bir gözlemcide böyle bir şey istiyorum

before_save object
  do_something_with object.original_name
end

Görev, güncelleme üzerine nesneyi bir karma tablodan kaldırmaktır (aslında, tablodaki başka bir anahtara taşımaktır).

Yanıtlar:


243

Raylardan önce 5.1

Ekleme _wasAyrıntınız size önceki değerini verecektir.

5.1+ raylar için

Lucas Andrade'nin aşağıdaki yanıtından kopyalandı : https://stackoverflow.com/a/50973808/9359123


Ekleme _was, 5.1 raylarında kullanımdan kaldırıldı, şimdi eklemelisiniz_before_last_save

Gibi bir şey:

before_save object
  do_something_with object.name_before_last_save
end

Veritabanındaki son kaydetmenizden önce ad değerini döndürür (kaydetme ve oluşturma için çalışır) Belgelere göre ve


arasındaki fark :_was_before_last_save

_was kaynak dokümanlardan

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

belgelerden _before_last_save kaynağı

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

7
Ör: için self.context:self.context_was
Freedom_Ben

2
Bunun için belgeler nerede?
j


Dokümantasyonda, için "kullanımdan kaldırma" uyarısı yoktur _was.
Rael Gugelmin Cunha

11

5.1+ raylar için

Ekleme _was, 5.1 raylarında kullanımdan kaldırıldı, şimdi eklemelisiniz_before_last_save

Gibi bir şey:

before_save object
  do_something_with object.name_before_last_save
end

Veritabanındaki son kaydetmenizden önce ad değerini döndürür (kaydetme ve oluşturma için çalışır) Belgelere göre ve


arasındaki fark :_was_before_last_save

_was kaynak dokümanlardan

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

belgelerden _before_last_save kaynağı

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

Burada daha iyi bir örnek görebilirsiniz


1
attribute_wasRails'in önceki sürümlerinde eşdeğeri olmayan tamamen yeni bir yöntem attribute_in_databaseiken attribute_before_last_save5.1'den itibaren kullanımdan kaldırılmıştır . Kaynak: github.com/rails/rails/pull/25337#issuecomment-225166796
ohaleck


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.