Rails一个父母,两个孩子,通过父母访问其他孩子的属性

时间:2013-06-27 00:15:07

标签: ruby-on-rails ruby ruby-on-rails-3 associations parent-child

问题:尝试开发一个提交自动回复电子邮件的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。

2 个答案:

答案 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分钟代替)。