3

问题:尝试开发发送自动回复电子邮件消息的 cron 作业或延迟作业。原来这是我认为的一个更棘手的问题。这是我的模型:

   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

我的目标是遍历所有订阅,并为每个订阅检查“订阅后的天数”是否与消息对象上的“注册后的天数”属性匹配。如果为真,则将消息传递给接收者,然后继续循环遍历其他消息。

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 

如果有人在 2 天前订阅了列表,并且列表所有者希望在注册后 2 天发送消息,那么应该发送消息,因为它是匹配的。

上面的deliver 方法是我尝试遍历所有订阅,并将subscription.days_since 与message.days_after_signiup 进行比较。

任何建议或想法将不胜感激。真的一直在努力解决这个问题,能够通过这个障碍感觉很棒。

D.

4

2 回答 2

1

我只需在send_by订阅中添加一个并使用 last_cron_run 和 Time.now 之间的范围来查看是否有任何Subscription.where(:send_by => last..now)落在该范围内。

我还会在订阅时计算 send_by 数据。

您还可以计算如何以这种方式发送下一个,并且您的 cron 作业仅基于 14 分钟块(00 - 14)运行并检查send_by. 也就是说,如果您将其设置为 15 分钟。如果没有,请使用您决定设置时间的任何内容,只需删除该范围的最后一分钟(例如,如果是一小时,请改用 59 分钟)。

于 2013-06-27T00:42:57.170 回答
1

你不能用 where 或 join 语句做点什么吗?

messages = Message.joins(:subscriptions).where("messages.days_since > subscriptions.days_after")
messages.each do |message|
    message.deliver
end
于 2013-06-27T00:26:27.470 回答