2010-10-28 15 views
10

Estoy tratando de mantener la lógica del modelo dentro de mi modelo, pero no puedo lograr que realice modificaciones sobre sí mismo y hacer que persistan en la base de datos.Rieles: ¿Cómo puedo llamar `self.save` en mi modelo y que persista en la base de datos?

En mi controlador:

@article.perform_some_calulcations! 

En mi modelo:

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

Si se me cae debugger declaraciones en mi método y después de mi llamada a ella en el controlador, @article.foo tiene el valor correcto. Sin embargo, cuando continúo, no persiste en la base de datos y webrick no informa ninguna declaración UPDATE.

¿Qué está pasando? No sé si alguna vez tuve que hacer esto antes, pero seguramente es posible, ¿verdad?

Respuesta

16

Su problema era que si se modifica un atributo "en su sitio", esto significa: sin asignar un nuevo valor, entonces los carriles va a pensar que no hay nada nuevo para ser salvo, por lo que " optimiza "guardar".

Cada acceso de escritura de su atributo establecerá un indicador, por lo que el método de guardar sabrá que debe verificar si el valor actual realmente difiere del valor leído de la base de datos. Es por eso que self.foo = self.foo.gsub(/regexp/, 'string') funciona (tenga en cuenta que el signo de admiración no es necesario aquí).

Si necesita modificar un atributo "en su sitio", por ejemplo, con gsub! o replace, uso:

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

Gracias por la información adicional – nfm

+0

Debe marcarse como respuesta IMHO – Kangur

+0

¿Es esta una buena práctica? es decir, ¿el modelo de llamada se guarda en sí mismo después de calcular algo? – Nicolas

2

Sus atributos pueden estar protegidos. Verifica tu registro. Si ese es el caso, entonces

self.save! 

o

self.save(false) 

trate de tomar el punto de exclamación fuera de su definición.


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

Buena idea, pero '' y 'self.save self.save (falso)' ambos tienen el mismo resultado. No hay signos de 'attr_protected' en ninguna parte ni advertencias en el registro de webrick. – nfm

+0

intente quitar el signo de exclamación de su definición. – s84

+0

No hay ningún problema con quitar el '!' Del nombre del método – nfm

Cuestiones relacionadas