7

ho il seguente frammento:Sapere quale evento ha attivato l'after_commit di un modello di ActiveRecord

class Product 
after_commit :do_something, on: %i(update create) 

def do_something 
    if # update 
    ... 
    else # create 
    ... 
    end 
end 
end 

Come sapere quale evento ha attivato il dopo commette qui?

Per favore non mi dica di avere 2 dopo commit come:

after_commit :do_something_on_update, on: :update 
after_commit :do_something_on_create, on: :create 
+0

Curioso ... hai provato un 'puts' (o qualcosa di simile) all'interno del callback' do_something' che avrebbe scaricato (cioè, 'inspect') gli argomenti del metodo (http://api.rubyonrails.org/ classi/ActiveRecord/Transazioni/ClassMethods.html # metodo-i-after_commit)? Nella parte inferiore di questa pagina Github Issues per Rails (https://github.com/rails/rails/issues/988) Rafeal Franca nota che sono solo argomenti (potrebbe valere un test rapido). –

risposta

3

ne dite basta controllare i previous_changes di id, se è nil, che significa che stiamo facendo create

def do_something 
    id_changes = self.previous_changes[:id] 
    # Creating 
    if id_changes && id_changes.first.nil? 
    ... 
    else # Updating 
    ... 
    end 
end 
2

ActiveRecord uses transaction_include_any_action?:

def do_something 
    if transaction_include_any_action?([:create]) 
    # handle create 
    end 
    if transaction_include_any_action?([:update]) 
    # handle update 
    end 
end 

Una transazione può includere più azioni. Se sia la :create che la :update sono possibili nella stessa transazione del programma, sono necessari due if s, non uno if/else.