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_all
no activará devoluciones de llamada
my_message.update_all(:created_at => ...)
# OR
Message.update_all({:created_at => ...}, {:id => my_message.id})
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.