Come ottenere il valore originale di un attributo in Rails


96

c'è un modo per ottenere il valore originale di un attributo ActiveRecord (= il valore che è stato caricato dal database)?

Voglio qualcosa di simile in un osservatore

before_save object
  do_something_with object.original_name
end

Il compito è rimuovere l'oggetto da una tabella hash (infatti, spostarlo su un'altra chiave nella tabella) al momento dell'aggiornamento.

Risposte:


243

Prima dei binari 5.1

L'aggiunta _wasal tuo attributo ti darà il valore precedente.

Per binari 5.1+

Copiato dalla risposta di Lucas Andrade di seguito : https://stackoverflow.com/a/50973808/9359123


L'aggiunta _wasè deprecata in rails 5.1, ora dovresti aggiungere_before_last_save

Qualcosa di simile a:

before_save object
  do_something_with object.name_before_last_save
end

Restituirà il valore del nome prima dell'ultimo salvataggio nel database (funziona per salvare e creare)


La differenza tra _wase _before_last_savesecondo la documentazione:

_è stato origine da documenti

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

_before_last_save fonte da documenti

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

7
Ad esempio: per self.context:self.context_was
Freedom_Ben

2
Dov'è la documentazione per questo?
j sarà il

4
la documentazione può essere trovata su apidock.com/rails/ActiveModel/Dirty/attribute_was
hexinpeter

Nella documentazione non è presente alcun avviso di "deprecazione" per _was.
Rael Gugelmin Cunha,

11

Per binari 5.1+

L'aggiunta _wasè deprecata in rails 5.1, ora dovresti aggiungere_before_last_save

Qualcosa di simile a:

before_save object
  do_something_with object.name_before_last_save
end

Restituirà il valore del nome prima dell'ultimo salvataggio nel database (funziona per salvare e creare)


La differenza tra _wase _before_last_savesecondo la documentazione:

_è stato origine da documenti

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

_before_last_save fonte da documenti

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

Puoi vedere un esempio migliore qui


1
attribute_wasè stato deprecato a favore di attribute_in_database, mentre attribute_before_last_saveè un metodo completamente nuovo dalla 5.1 che non ha equivalenti nelle versioni precedenti di Rails. Fonte: github.com/rails/rails/pull/25337#issuecomment-225166796
ohaleck


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.