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