2010-10-28 6 views
10

Sto cercando di mantenere la logica del modello all'interno del mio modello, ma non riesco a farlo eseguire modifiche su se stesso e mantenerle nel database.Rails: come posso chiamare `self.save` nel mio modello e mantenerlo nel database?

Nel mio controller:

@article.perform_some_calulcations! 

Nel mio modello:

def perform_some_calculations! 
    self.foo.gsub!(/regexp/, 'string') 
    self.save 
end 

Se cado debugger dichiarazioni nel mio metodo e dopo la mia chiamata ad esso nel controller, @article.foo ha il valore corretto. Tuttavia, quando continuo, non persiste nel database e webrick non riporta alcuna istruzione UPDATE.

Cosa non va? Non so se ho mai dovuto farlo prima, ma sicuramente è possibile vero?

risposta

16

Il tuo problema è che se si modifica un attributo "sul posto", questo significa: senza assegnare un nuovo valore, quindi Rails penseranno che non c'è nulla di nuovo da salvare, in modo che " ottimizza "il save away.

Ogni accesso di scrittura del proprio attributo imposterà un flag, quindi il metodo di salvataggio saprà che deve verificare se il valore corrente differisce realmente dal valore letto dal database. Ecco perché self.foo = self.foo.gsub(/regexp/, 'string') funziona (notare che il punto esclamativo non è necessario qui).

Se è necessario modificare un attributo "a posto", ad esempio con gsub! o replace, uso:

def perform_some_calculations! 
    foo_will_change! 
    self.foo.gsub!(/regexp/, 'string') 
    self.save 
end 
+0

Grazie per le informazioni aggiuntive – nfm

+0

Dovrebbe essere contrassegnato come risposta IMHO – Kangur

+0

Questa è una buona pratica? cioè il modello che chiama salva su se stesso dopo aver calcolato qualcosa? – Nicolas

2

Gli attributi potrebbero essere protetti. Controlla il tuo registro. Se questo è il caso, allora

self.save! 

o

self.save(false) 

provare a prendere il punto esclamativo fuori la tua definizione.


self.foo = self.foo.gsub!(/regexp/, 'string') 
+0

buona idea, ma '' e 'self.save self.save (false)' entrambi hanno lo stesso risultato. Nessun segno di "attr_protected" o di qualsiasi avviso nel registro di Webrick. – nfm

+0

prova a togliere il punto esclamativo dalla tua definizione. – s84

+0

Nessun dado con la rimozione di '!' Dal nome del metodo – nfm

Problemi correlati