2011-10-11 31 views
11

Tôi đang làm việc trên một chức năng mà tôi cần kích hoạt thư đến danh sách người dùng khi giá trị trường bản ghi đã được cập nhật thành công.Rails - ActiveRecord - Kích hoạt thư khi thay đổi giá trị trường

Ví dụ: Tôi có một mô hình Blog đã xuất bản thuộc tính (đại diện cho một cột trong bảng cơ sở dữ liệu của tôi) với giá trị mặc định là sai. Khi người dùng xuất bản blog, giá trị trường sẽ trở thành sự thật và tôi cần gửi một số thư.

  1. Cách tốt nhất để làm điều đó là gì?
  2. Nếu tôi có thể sử dụng gọi lại after_update, làm cách nào tôi biết được rằng cột đã xuất bản đã được cập nhật trong cuộc gọi cập nhật cuối cùng?
  3. Có cách nào để truy cập vào giá trị cũ của thuộc tính đã xuất bản sau khi cập nhật không?

Bất kỳ trợ giúp được đánh giá cao ...

Trả lời

27

1) có thể là một chút chủ quan nhưng tôi sẽ trả lời rằng cùng với 2) ActiveRecord cung cấp phương pháp để cho biết một thuộc tính đã thay đổi. Bạn có thể sử dụng tên thuộc tính + _changed?. Ví dụ. Nếu mô hình của bạn có một thuộc tính name, sau đó nó cũng sẽ trả lời #name_changed? Dưới đây là một cách để bạn có thể gửi email chỉ nếu một thuộc tính đã được thay đổi:

class MyModel 
    after_update :send_email, :if => :column_name_changed? 

    def send_email 
    # Send email here 
    end 
end 

3) Giá trị thuộc tính cũ có thể được truy cập bằng cách thêm _was . Ví dụ. #name_was sẽ trả về giá trị cũ của trường tên.

UPDATE:

Để gửi email mới chỉ là lần đầu tiên mà một lĩnh vực được chuyển từ false thành true bạn sẽ cần phải thêm lĩnh vực khác để cơ sở dữ liệu của bạn, chẳng hạn như email_sent. Vì điều kiện cho cuộc gọi lại send_email trở nên phức tạp hơn, tôi đã chuyển nó vào chính cuộc gọi lại. Sau khi email được gửi, hãy đặt trường email_sent thành true, do đó không có email nào được gửi nữa.

class MyModel 
    after_update :send_email 

    def send_email 
    if column_name_changed? && !email_sent? 
     # Send email here 
     update_attribute :email_sent, true 
    end 
    end 
end 
+0

Cảm ơn bạn đã trả lời nhanh. Có cách nào để kích hoạt thư chỉ một lần (giá trị trường thời gian đầu tiên thay đổi từ sai sang đúng) không? – nkm

+0

Chắc chắn, tôi đã cập nhật câu trả lời của mình để chỉ gửi email một lần –

+0

Nó sẽ không đi vào vòng lặp vô hạn nếu bạn sẽ cập nhật lại trong khối. –

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