Bonus Features của Active Record.
Observers là gì và khi nào dùng?
Đặt vấn đề:
Implement chức năng send email trong model Project tới user khi một project đc tạo ra.
class Project < ActiveRecord::Base
after_save :send_email
private
def send_email
# implement send email logic here
end
end
Đợi đã, 1 cái callback thì ko sao nhưng với 10+ cái callback đc nhồi nhét vô trong model thì trông thật khó nhìn với hầm bà lằng cùng các scope, validate, attributes,… Cả một vấn đề đấy
Phương án: Tách thành module nhỏ nhỏ rồi include các kiểu vào trong model chính.
Câu hỏi đặt ra: Có cách nào hỗ trợ bởi Rails ko?
ActiveRecord::Observers là gì?
- Là một feature của ActiveRecord
- Là một cách để include các functionality không phải là core concept vào model
- Là phương pháp để giữ cho
the actual data modelkhông bị cluttering up or obfuscate bởi các functionality được thêm vào. - Được sử dụng với những feature sau: transaction logging, send notification, alerts, send email (background job)
Example: Refactor đoạn code ở trên
# app/models/project.rb
class Project < ActiveRecord::Base
# nothing here
end
# app/observers/email_observer.rb
class EmailObserver < ActiveRecord::Observers
observer Project, Issue # Note 1
def send_email
# logic here
end
end
# config/environment.rb
config.observers = [:email] # Note 2
Chú thích :
Note1: Observers sẽ tự động map với class cùng tên với nó (ví dụ: EmailObserver sẽ map với model Email )
Ở đây ta dùng cho model project và cả model issue (multiple model)
nên phải dùng cách khai báo như sau:
observer Project, Issue, # something else
Note2: Đây là cách configure một observer
Tuy nhiên lạm dụng nó cũng chả tốt lắm đâu. Đôi khi cứ như cách thông thường là đủ rồi.