问题:尝试开发一个提交自动回复电子邮件的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
我的目标是遍历所有订阅,并针对每个订阅检查以查看“订阅后的天数”是否与消息对象上的“注册后的天数”相匹配。如果为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
如果有人在2天前订阅了一个列表,并且列表所有者希望在注册后2天发送一条消息,则该消息应该发送,因为它是匹配的。
上面的传递方法是我尝试遍历所有订阅,并将subscription.days_since与message.days_after_signiup进行比较。
非常感谢任何建议或想法。真的一直在努力解决这个问题,通过这个障碍会感觉很棒。
d。
答案 0 :(得分:1)
难道你不能用where或join语句做点什么吗?
messages = Message.joins(:subscriptions).where("messages.days_since > subscriptions.days_after")
messages.each do |message|
message.deliver
end
答案 1 :(得分:1)
我只需在订阅中添加send_by
,并使用last_cron_run和Time.now之间的范围来查看是否有任何Subscription.where(:send_by => last..now)
属于该范围。
我还会在订阅时计算send_by数据。
您还可以计算如何以这种方式发送下一个,并且您的cron作业仅基于14分钟块(00 - 14)运行并检查send_by
的分钟。如果你把它设置为15分钟就行了。如果没有,请使用您决定设置时间的任何内容,只需砍掉该范围的最后一分钟(例如,如果一小时,则使用59分钟代替)。