7

Ich habe folgende Code-Schnipsel:wissen, was Ereignis ausgelöst, um die after_commit eines Activerecord-Modell

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

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

Wie kann man wissen, welches Ereignis ausgelöst, um die nach dem hier begehen?

Bitte erzählen Sie mir nicht 2 nach Commits wie haben:

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

Neugierig ... haben Sie versucht, eine 'puts' (oder etwas Ähnliches) innerhalb des 'do_something'-Callbacks auszugeben, das die Args der Methode ausgibt (dh' inspect') (http://api.rubyonrails.org/) Klassen/ActiveRecord/Transaktionen/ClassMethods.html # method-i-after_commit)? Am Ende dieser Github-Issues-Seite für Rails (https://github.com/rails/rails/issues/988) merkt Rafeal Franca an, dass es sich nur um Argumente handelt (könnte einen schnellen Test wert sein). –

Antwort

3

Wie wäre es nur die previous_changes von id zu überprüfen, ob es nil ist, das heißt, wir create tun

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 

Eine Transaktion kann mehrere Aktionen enthalten. Wenn sowohl :create als auch :update in der gleichen Transaktion in Ihrem Programm möglich sind, benötigen Sie zwei if s, keine if/else.