Sự khác biệt giữa `after_create` và` after_save` và khi nào nên sử dụng cái gì?


124

Đang after_createafter_savegiống như mỗi chức năng?

Tôi muốn thực hiện một thao tác với email của người dùng sau khi tạo tài khoản.

Tôi muốn thực hiện thao tác đó khi nó được lưu trong cơ sở dữ liệu.

cái nào thích hợp hơn để sử dụng: after_createhay after_save?

Câu trả lời:


212

after_create chỉ hoạt động một lần - ngay sau khi bản ghi được tạo lần đầu tiên.

after_save hoạt động mỗi khi bạn lưu đối tượng - ngay cả khi bạn chỉ cập nhật nó nhiều năm sau

Vì vậy, nếu bạn muốn thực hiện thao tác email này chỉ một lần (và sau đó không bao giờ nữa) thì hãy sử dụng after_create.

Nếu bạn muốn làm điều đó mỗi khi đối tượng được lưu, thì hãy thực hiện nó trongafter_save


2
độc giả cần lưu ý rằng, theo các tài liệu , ActiveRecord update_allkhông gọi bất kỳ cuộc gọi lại nào, kể cảafter_*
user2426679

93

Từ các tài liệu :

after_create()

Được gọi sau khi Base.savecác đối tượng mới chưa được lưu (chưa có bản ghi).

after_save()

Được gọi sau Base.save (bất kể đó là tạo hay cập nhật lưu).


1
after_save()

Hoạt động tốt khi bạn phải lưu các mô hình không thường xuyên lưu. Đối với ví dụ cụ thể này về việc thay đổi hồ sơ thường xuyên, nên sử dụng

 after_commit()

đảm bảo rằng mô hình được lưu trong cơ sở dữ liệu trước khi hành động được thực hiện sau_commit: notify_credit_score

def calculate_credit_score
     #Call a Cron job
end

Bạn khuyên nên sử dụng after_commitnhưng không giải thích tại sao. Xin vui lòng giải thích? Lưu ý rằng after_commitchạy trên tạo, cập nhật và phá hủy. Documents: apidock.com/rails/ActiveRecord/Transactions/ClassMethods/... Vì vậy, nó không phải là hành vi tương tự như after_saveBạn thực sự muốn gọi cron_job rằng sau khi sau khi phá hủy các hồ sơ? Hoặc trong trường hợp ops, gửi email cho người dùng hiện đã bị xóa? Hãy cẩn thận với việc sử dụngafter_commit
rmcsharry

after_commitchạy trên các hoạt động CRUD đó, vì vậy nếu trong trường hợp của anh ta, email được cập nhật thường xuyên, thì việc kết hợp hành động cho một cuộc gọi lại cụ thể sẽ dễ dàng hơn. Trong trường hợp của tôi, tôi đã sử dụngafter_commit : calculate_profile_update, on: :update
pensebien
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.