7

Mam następujący fragment:wiedzieć, co zdarzenie wywołało after_commit danego modelu ActiveRecord

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

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

Jak wiedzieć, co wywołało zdarzenie po popełnić tutaj?

proszę nie mów mi mieć 2 po zatwierdzeń typu:

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

Ciekawy ... czy wypróbowałeś 'puts' (lub coś podobnego) wewnątrz wywołania' do_something', które zrzuciłoby (tj. 'Inspect') argumenty metody (http://api.rubyonrails.org/ classes/ActiveRecord/Transactions/ClassMethods.html # method-i-after_commit)? W dolnej części strony Github Issues dla Railsów (https://github.com/rails/rails/issues/988) Rafeal Franca zauważa, że ​​są to tylko argumenty (może warto przeprowadzić szybki test). –

Odpowiedz

3

Jak o właśnie sprawdzić previous_changes dowodu osobistego, jeżeli jest nil, czyli robimy 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 

Transakcja może obejmować wiele działań. Jeśli w tej samej transakcji w programie są możliwe zarówno :create, jak i :update, potrzebne są dwa if s, a nie if/else.

Powiązane problemy