0

ruby 上的新手,使用 windows xp 和 rails 3,我想每 7 天向用户发送电子邮件,持续 34 周,我有 usermailer,每 7 天发送电子邮件,我也想要34 周

我有用户邮件程序向用户发送电子邮件,我已经定义了一种方法,每 7 天发送一次电子邮件,并使用 Windows 任务计划程序从批处理文件中调用它,
我还想知道用户现在在哪一周?

例如,用户在 4 月怀孕并在 6 月发情,然后会有一条欢迎消息,然后她怀孕的前 8 周不在我们的记录中,这意味着电子邮件将从第 9 周开始,因为 34 - 8 = 26周,因此用户将收到 26 封电子邮件(每 1 周 1 封电子邮件)。

我的模型:

class Dop < ActiveRecord::Base
  attr_accessible :date, :mail, :name
  validates_presence_of :name
  validates_presence_of :mail
  validates_uniqueness_of :mail
  validates_format_of :mail, :with =>
  %r{^(?:[_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-zA-Z0-9\-\.] 
  +)*(\.[a-z]{2,4})$}i

  def self.send_mail
    Dop.all.each do |dop|
      UserMailer.welcome_email(dop).deliver if dop.date.to_time <= Time.now - 7.day
    end
  end
end

我的批处理文件:

 echo rails run
 cd c:\dop
 rails r "Dop.send_mail"

 echo done
 pause

Dop 是指怀孕日期。

4

2 回答 2

0

根据您的环境,纯 ruby​​ 解决方案如下所示:

class Dop < ActiveRecord::Base
  def self.send_mail
    Dop.all.each do |dop|
      UserMailer.welcome_email(dop).deliver if within_thirty_four_weeks?(date) && seventh_day(dop.date) 
    end
  end

  def self.seventh_day?(date)
    days_diff % 7 == 0
  end

  def self.within_thirty_four_weeks?(date)
    days_diff(date) <= 34.weeks
  end

  def self.days_diff(date)
    (Time.zone.now - date).to_i / 1.day
  end
end

但是,我更喜欢更多的数据库解决方案。其中这变得更复杂,sqlite 没有与 MySql 或 Postgres 相同的日期函数。(可以修补 Sqlite 以保持您的测试/开发环境像生产一样,但我将其保存为另一个问题。)

class Dop < ActiveRecord::Base
  def self.send_mail
    Dop.where("(julianday('now') - julianday(date(date))) % 7 = 0").
        where("date('now', '-238 days') < date").
        each do |dop|
          UserMailer.welcome_email(dop).deliver
    end
  end
end

就个人而言,数据库解决方案(选项 2)是最优雅的解决方案。虽然它更脆弱,因为它特定于 sqlite 的日期函数。

将此安排为每晚运行,它将每 7 天通过电子邮件发送一次,持续 34 周。

于 2012-07-04T17:24:10.620 回答
0

我已经通过在我的类方法中添加 1 行代码来解决它

 def self.send_mail
  Dop.all.each do |dop| 
  where(dop.date.to_time <= Time.now - 34.week)
  UserMailer.welcome_email(dop).deliver if dop.date.to_time <= Time.now - 7.day
   end
 end
于 2012-07-05T10:31:09.710 回答