update rails example before_update before after_create active ruby-on-rails ruby-on-rails-3 before-filter update-attributes before-save

ruby on rails - rails - ¿Cómo "actualizar_atributos" sin ejecutar "antes_save"?



rails before_update (5)

En los rieles 3.1 update_column .

De otra manera:

En general, la forma más elegante de evitar las devoluciones de llamada es la siguiente:

class Message < ActiveRecord::Base cattr_accessor :skip_callbacks before_save lambda { foo(publisher); bar }, :unless => :skip_callbacks # let''s say you do not want this callback to be triggered when you perform batch operations end

Entonces, puedes hacer:

Message.skip_callbacks = true # for multiple records my_message.update_attributes(:created_at => ...) Message.skip_callbacks = false # reset

O, solo para un registro:

my_message.update_attributes(:created_at => ..., :skip_callbacks => true)

Si lo necesita específicamente para un atributo de Time , entonces touch hará el truco como lo menciona @lucapette.

Tengo un before_save en mi modelo de Message definido de esta manera:

class Message < ActiveRecord::Base before_save lambda { foo(publisher); bar } end

Cuando lo hago:

my_message.update_attributes(:created_at => ...)

Se ejecutan foo y bar .

A veces, me gustaría actualizar los campos del mensaje sin ejecutar foo y bar .

¿Cómo podría actualizar, por ejemplo, el campo created_at (en la base de datos) sin ejecutar foo y bar ?


También puede hacer que su acción before_save condicional.

Así que agregue alguna variable de campo / instancia, y configúrela solo si desea omitirla, y verifique eso en su método.

P.ej

before_save :do_foo_and_bar_if_allowed attr_accessor :skip_before_save def do_foo_and_bar_if_allowed unless @skip_before_save.present? foo(publisher) bar end end

y luego escribir en algún lugar

my_message.skip_before_save = true my_message.update_attributes(:created_at => ...)


Usa el método touch . Es elegante y hace exactamente lo que quieres.



update_column o update_columns es el método más cercano a update_attributes y evita las devoluciones de llamadas sin tener que eludir manualmente nada.