3

問題:試圖開發一個cron作業或推遲發送自動回覆電子郵件的作業。我發現這是一個棘手的問題。這裏是我的模型:Rails一個父母,兩個孩子,通過父母訪問其他孩子的屬性

class List < ActiveRecord::Base 
    has_many :subscriptions 
    has_many :contacts, :through => :subscriptions 
    has_many :messages 

    class Subscription < ActiveRecord::Base 
    belongs_to :contact 
    belongs_to :list 

    class Message < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :list 

     -----------Lists------------ 
     |       | 
     |       | 
     Subscriptions (join)   Messages 
     | 
     | 
     Contacts 

我的目標是要遍歷所有訂閱,併爲每個訂閱檢查,如果看到「日以來的訂閱」,「註冊後的日子」的消息對象屬性相匹配。如果爲true,則將消息傳遞給收件人,然後繼續循環播放其他消息。

class SubscriptionsController < ApplicationController 

def deliver 
    @subscriptions = Subscription.all 
    @subscriptions.each do |subscription| 
     subscription.list.messages.each do |message| 
       if message.days_since == subscription.days_after 
        # deliver message through mailer in a scheduled delayed_job 
       else 
       end 
     end 
    end  
    end 

如果有人訂閱列表3天前,與名錄所有者想在註冊後2天交付的消息,則該消息應該被傳遞,因爲這是一個比賽。

上面的遞送方法是我試圖遍歷所有訂閱,並將subscription.days_since與message.days_after_signiup進行比較。

任何意見或想法將非常感激。真的一直在苦苦掙扎,通過這個路障會感覺很好。

D.

回答

1

難道你只是做一些事情或加入聲明?

messages = Message.joins(:subscriptions).where("messages.days_since > subscriptions.days_after") 
messages.each do |message| 
    message.deliver 
end 
+0

我將嘗試在訂閱和消息之間添加交付連接表。似乎有一個單獨的第一類對象對此有意義。交付模型和連接表應該有助於實現遍歷所有訂閱的簡單嵌套循環,並且對於每個訂閱,抓取具有匹配的「天」屬性的任何消息,然後安排電子郵件發送。感謝您解決CreativeReason問題的一些亮點,非常感謝。 – DanHodgins

1

我只是添加一個send_by來訂閱和使用使用範圍last_cron_run和Time.now之間,看看是否有Subscription.where(:send_by => last..now)屬於這個範圍。

我還會在訂閱時計算send_by數據。

您還可以計算如何以這種方式發送下一個,並且您的cron作業僅基於14分鐘的塊(00-14)運行,並檢查send_by的分鐘。這就是如果你設置了15分鐘。如果不是,則使用您決定設置時間的任何內容,只是截斷該範圍的最後一分鐘(例如,如果一小時,則使用59分鐘)。

+0

cron_run Pjammer的精彩點子,感謝您花時間分享您的見解。 – DanHodgins