7

Tôi có đoạn như sau:Biết sự kiện đã kích hoạt các after_commit của một mô hình ActiveRecord

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

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

Làm thế nào để biết những gì sự kiện gây ra sau khi cam kết ở đây?

Xin đừng cho tôi biết có 2 sau khi cam kết như:

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

Tò mò ... bạn đã thử một 'đặt' (hoặc một cái gì đó tương tự) bên trong cuộc gọi lại' do_something' sẽ đổ ra (tức là 'kiểm tra') phương thức args (http://api.rubyonrails.org/) lớp/ActiveRecord/Giao dịch/ClassMethods.html # method-i-after_commit)? Trên dưới cùng của trang Github vấn đề này cho Rails (https://github.com/rails/rails/issues/988) Rafeal Franca lưu ý họ chỉ là đối số (có thể là giá trị một bài kiểm tra nhanh). –

Trả lời

3

Làm thế nào về chỉ cần kiểm tra các previous_changes của id, nếu nó là nil, có nghĩa là chúng ta đang làm 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 

Một giao dịch có thể bao gồm nhiều hành động. Nếu cả hai số :create:update đều có thể thực hiện trong cùng một giao dịch trong chương trình của bạn, bạn cần hai số if s, không phải là if/else.

Các vấn đề liên quan