7

ait after_commit tetikleyen aşağıdaki pasajı vardır:bilir hangi olay bir ActiveRecord modeli

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

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

nasıl sonra burada taahhüt tetiklenen hangi olay bilmek?

gibi kaydedilmesini sonra 2 olması söyleme edin:

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

Meraklı ... "do_something" geri çağırma yönteminin içine bir "puts" (ya da benzer bir şey) denediniz mi? (',' Teftiş ') metodun args (http://api.rubyonrails.org/ sınıfları/ActiveRecord/İşlemler/ClassMethods.html # yöntemi-i after_commit)? Rails için bu Github Sorunları sayfasının alt kısmında (https://github.com/rails/rails/issues/988) Rafeal Franca sadece argümanlar olduklarını belirtiyor (hızlı bir teste değer olabilir). –

cevap

3

Nasıl nil ise sadece biz create

def do_something 
    id_changes = self.previous_changes[:id] 
    # Creating 
    if id_changes && id_changes.first.nil? 
    ... 
    else # Updating 
    ... 
    end 
end 
yapıyoruz demek ki, id previous_changes kontrol hakkında
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 

Bir işlem birden çok eylem içerebilir. Programınızda aynı işlemde hem :create hem de :update mümkün ise, if/else değil, iki if s gerekir.

İlgili konular