J'ai un observateur et je enregistrer un after_commit
de rappel.
Comment puis-je savoir le temps qu'il a été congédié après avoir créer ou mettre à jour?
Je peux dire un élément a été détruit en demandant item.destroyed?
mais new_record?
ne fonctionne pas étant donné que l'élément a été enregistré.
J'allais à résoudre par l'ajout d' after_create
/after_update
comme @action = :create
à l'intérieur et vérifier l' @action
à after_commit
, mais il semble que l'observateur de l'instance est un singleton, et je pourrais juste remplacer une valeur avant qu'il arrive à l' after_commit
. Donc je l'ai résolu en une plus laide façon, le stockage de l'action dans une carte basée sur l'élément.id sur after_create/mise à jour et la vérification de sa valeur sur after_commit. Vraiment moche.
Est-il un autre moyen?
Mise à jour
@Tardate dit, transaction_include_action?
est une bonne indication, mais c'est une méthode privée, et un observateur, il doit être accessible avec #send
.
class ProductScoreObserver < ActiveRecord::Observer
observe :product
def after_commit(product)
if product.send(:transaction_include_action?, :destroy)
...
Malheureusement, l' :on
option ne fonctionne pas en qualité d'observateurs.
Assurez-vous de tester l'enfer de vos observateurs ( test_after_commit
gem si vous utilisez use_transactional_fixtures) ainsi, lorsque vous mettez à niveau à nouveau les Rails de la version que vous savez si il fonctionne encore.
(Testé sur 3.2.9)
Mise à jour 2
Au lieu d'Observateurs, j'ai maintenant utilisons::de la sollicitude et de l' after_commit :blah, on: :create
il y travaille.