Được, nhưng chỉ vì Active Job không gửi object đi — nó serialize thành GlobalID (chuỗi dạng gid://app/User/42) rồi khi worker chạy mới find lại từ DB.
WelcomeJob.perform_later(user) # queued as gid://app/User/42Hệ quả cần biết:
- Nếu record bị xoá trước khi job chạy, job ném ActiveJob::DeserializationError (bọc RecordNotFound). Rails mặc định discard job này thay vì retry vô hạn.
- Job luôn đọc trạng thái mới nhất trong DB, không phải trạng thái lúc enqueue. Nếu cần chụp lại giá trị tại thời điểm enqueue (vd giá tiền), phải truyền giá trị đó tường minh chứ không truyền object.
- Chỉ các kiểu cơ bản (String, Integer, Hash, Array, Symbol, Date/Time, và object có GlobalID) mới serialize được. Truyền một object thường sẽ ném SerializationError; muốn hỗ trợ thì đăng ký custom serializer.
Thực tế nhiều team chọn truyền id thuần cho rõ ràng và tránh phụ thuộc vào GlobalID; đổi lại phải tự xử lý trường hợp record không còn tồn tại. Kiểu gì cũng phải giữ payload nhỏ — hàng đợi lưu payload dưới dạng JSON, không phải chỗ để nhét cả object lớn.