J'ai un modèle particulièrement complexe avec des validations et des callbacks définis. Les besoins de l'entreprise exigent maintenant un scénario particulier où l'ajout d'un nouvel enregistrement nécessite d'ignorer les validations et les rappels. Quelle est la meilleure façon de procéder ?
Réponses
Trop de publicités?Utilisez ActiveRecord::Persistence#update_column comme ceci :
Model.update_column(field, value)
Mon point de vue était le suivant (note : cela désactive les callbacks sur la création, pour la mise à jour, la suppression et autres, vous devez les ajouter au tableau).
begin
[:create, :save].each{|a| self.class.skip_callback(a) } # We disable callbacks on save and create
# create new record here without callbacks, tou can also disable validations with
# .save(:validate => false)
ensure
[:create, :save].each{|a| self.class.set_callback(a) } # and we ensure that callbacks are restored
end
Que diriez-vous d'ajouter une méthode à votre modèle qui vous permettrait d'éviter les rappels ?
class Foo < ActiveRecord::Base
after_save :do_stuff
def super_secret_create(attrs)
self.skip_callback(:create)
self.update_attributes(attrs)
self.save(:validate => false)
self.set_callback(:create)
end
end
Si vous finissez par utiliser quelque chose comme ça, je recommanderais d'utiliser self dans la méthode au lieu du nom du modèle pour éviter la connotation du nom.
Je suis aussi tombé sur une idée de Sven Fuchs qui a l'air bien, c'est aquí
J'ai écrit une gemme simple pour sauter les validations adhoc, mais elle pourrait probablement être mise à jour pour inclure également le saut des rappels.
https://github.com/npearson72/validation_skipper
Vous pourriez prendre le can_skip_validation_for
dans la gemme et ajoute une fonctionnalité pour sauter les callbacks. Peut-être appeler la méthode can_skip_validation_and_callbacks_for
Tout le reste fonctionnerait de la même manière. Si vous voulez de l'aide pour faire ça, faites-le moi savoir.