1 votes

Sauter le rappel après la mise à jour

J'ai un modèle qui utilise after_update pour enregistrer les changements. Il y a un cas où je voudrais apporter une modification au modèle sans activer ce mécanisme de journalisation. Existe-t-il un moyen de passer un paramètre à after_update, ou de l'ignorer complètement ?

J'aimerais trouver une bonne solution à ce problème, et je suis prêt à supprimer after_update s'il existe une meilleure façon de procéder.

3voto

mikej Points 30224

Je suivrais l'approche consistant à ajouter un booléen au modèle, comme suggéré, mais j'écrirais ensuite une méthode pour aider à activer et désactiver le drapeau après votre mise à jour.

def without_logging_changes_to(model)
  # store current value of the flag so it can be restored
  # when we leave the block
  remembered_value = model.log_update
  model.log_update = false
  begin
    yield
  ensure
    model.log_update = remembered_value
  end
end

Puis de l'utiliser :

without_logging_changes_to my_model do
  my_model.update_attributes(updates)
end

0voto

Simone Carletti Points 77653
class MyModel < ActiveRecord::Base

  after_update :do_something

  attr_accessor :should_do_something

  def should_do_something?
    should_do_something != false
  end

  def do_something
    if should_do_something?
      ...
    end
  end

end

y = MyModel.new
y.save! # callback is triggered

n = MyModel.new
n.should_do_something = false
n.save! # callback isn't triggered

0voto

Dans Rails 2, vous pouvez utiliser des méthodes privées ActiveRecord

update_without_callbacks
create_without_callbacks

Ils peuvent être invoqués via la méthode d'envoi :

# Update attributes on your model
your_model.some_attribute = some_value

# Update model without callbacks
your_model.send(:update_without_callbacks)

0voto

twolfe18 Points 1091

Vous pourriez ajouter un booléen à votre modèle qui serait quelque chose comme log_last_update et vérifier cela dans le callback after_update.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X