2015-04-06 16 views
6

Sto cercando di ottenere il valore precedente nel before_save aggiungendo "_was" al mio valore ma non sembra funzionare.Rails - Ottieni il vecchio valore in before_save

Ecco il mio codice:

before_save :get_old_title 

def get_old_title 
    puts "old value #{self.title_was} => #{self.title}" 
    end 

Entrambi "title_was" e "titolo" ha ottenuto il nuovo titolo appena stato salvato.

È possibile ottenere il valore precedente all'interno di before_save?

+0

Stai cercando di ottenere il valore precedente prima di aggiornare gli stessi dati di riga? – sansarp

+0

sì, diciamo che il mio vecchio valore era "batman" e l'ho cambiato in "superman", voglio ottenere "batman" – user2037696

+1

Invece di before_save usare before_update – sansarp

risposta

5

Invece di before_save utilizzare before_update. Dovrebbe funzionare ora.

+0

Perché non ha funzionato con 'before_save'? –

+1

before_save chiamato al momento della creazione dell'oggetto (solo una volta) e delle chiamate before_update ogni volta che l'oggetto viene aggiornato. –

+0

sì, @SachinR hai ragione. – sansarp

0

Quindi, la risposta di cui sopra potrebbe funzionare, ma cosa succede se volevo ottenere il valore precedente per qualche motivo e utilizzarlo per eseguire alcune attività, allora avresti bisogno di ottenere il valore precedente. Nel mio caso ho usato questo

after_update do 
    if self.quantity_changed? 
    sku.decrement(:remaining, (self.quantity_was - self.quantity) * sku.quantity) 
    end 
end 

Il _was e _changed? aggiunto a qualsiasi colonna farebbe il lavoro per portare a termine il lavoro.

1

Il motivo per cui si ottiene lo stesso valore è molto probabilmente perché si controlla l'output durante la creazione del record. Il callback before_save viene chiamato sia su create() sia su update() ma su create() sia title sia title_was viene assegnato lo stesso valore iniziale. Quindi la risposta è "sì, è possibile ottenere il vecchio valore all'interno di before_save" ma è necessario ricordare che sarà diverso dal valore corrente solo se il record è stato effettivamente modificato. Ciò significa che i risultati ottenuti sono corretti, poiché la modifica in questione non si verifica quando viene creato il record.

Problemi correlati