0

有幾個階段,因爲我相對較新的軌道,我不確定我是否以最好的方式接近這一點。自定義模型方法,設置自動發送郵件的範圍

用戶關注某些日子的公司,公司申請開放和關閉。如果用戶關注公司,我希望他們在a)公司申請開放時b)自動收到電子郵件,b)公司申請關閉前一週,c)公司申請關閉的那一天。

我已經嘗試使用命名範圍。根據日期的不同,我有以下模型方法(我認爲這需要一些工作)來設置每個公司的範圍。

firms.rb

def application_status 
    if open_date == Today.date 
     self.opening = true 
    else 
     self.opening = false 
    end 

    if ((close_day - Today.date) == 7) 
    self.warning = true 
     else 
    self.warning = false 
    end 

    if close_day == Today.date 
    self.closing = true 
     else 
    self.closing = false 
    end 
end 

我想這個方法模型對每家公司每天一次被調用,因此每個企業都有適當的範圍 - 所以我使用每當寶石(的cron)曾嘗試和下面的代碼。對每家公司運行上述模型方法。

Schedule.rb

every 1.day do 
runner "Firm.all.each do |firm| 
    firm.application_status 
end" 
end 

然後爲每個範圍開放,警告,最後,我有一個方法在每次調度文件,爲簡單起見,我將只顯示開放的方法。以下查詢適用於所有開放範圍的公司,並對其運行application_open_notification方法。

Schedule.rb

every 1.day do 
runner "Firm.opening.each do |firm| 
    firm.application_open_notification 
end" 
end 

這就要求在Firm.rb模型

def application_open_notification 
    self.users.each do |user| 
    FirmMailer.application_open(user, self).deliver 
    end 
end 

進而調用的最後一塊拼圖......應該向用戶發送下面的方法一封電子郵件,包括公司的名稱。

def application_open(user,firm) 
    @firm = firm 
    @user = user 
    mail to: @user.email, subject: @firm' is now accepting applications' 
    end 
end 

這是一個可行的方法來解決這個問題?特別是我對模型中的編碼不是很熟悉。

非常感謝您提供的任何幫助。

回答

1

我想這openingwarningclosing是數據庫領域,你有一個像範圍:

class Firm < ActiveRecord::Base 
    scope :opening, :where => { :opening => true } 
    # etc 
end 

沒有爲數據庫中的一般規則(和,好了,所有的存儲):不存儲你可以計算的東西,如果你不需要的話。

由於應用程序的狀態可以從當天的日期和open_dateclose_day字段確定,因此可以根據需要計算它們,而不是爲它們創建額外的字段。您可以使用SQL和Active Record的做到這一點。

scope :opening, :where { :open_date => (Date.today .. Date.today+1) } 
scope :warning, :where { :close_day => (Date.today+7 .. Date.today+8) } 
scope :closing, :where { :close_day => (Date.today .. Date.today+1) } 

(請注意,這些選擇時間段他們可能取決於如果您正在使用datetime場改變。)

但還有另外一個問題:如果出於某種原因(計算機崩潰,代碼錯誤等),您的預定程序無法在特定日期運行,會發生什麼情況?你需要一種確保通知最終被髮送的方式,即使有些事情中斷了。解決辦法有兩個:

  1. 寫你的日程安排程序有選擇地接受日期今天除了(通過ARGV
  2. 守旗每家公司對於是否每種通知已發送。這些將不得不存儲在數據庫中。

請注意,範圍是沒有必要的。你可以這樣做:

Firm.where(:open_date => (Date.today .. Date.today+1)).each do |firm| 
    #... 
end 

但是範圍至少封裝了識別各種記錄集的細節。

+0

我認爲你跳過範圍和創建模型方法的想法是ALOT更清潔,那麼我可以每天調用一次這些方法。謝謝你,這真的是一個很好的幫助! – RMcNairn 2012-04-11 11:05:37