0

Rubyの新機能で、Windows XPとRails3を使用して、34週間7日ごとにユーザーにメールを送信したいのですが、34週間も7日ごとにメールを送信するusermailerがありますか?

ユーザーメーラーにユーザーにメールを送信させ、7日ごとにメールを送信し、Windowsタスクスケジューラ
も使用してバッチファイルから呼び出す方法を定義しました。また、ユーザーが現在どの週にいるのか知りたいですか?

たとえば、ユーザーが4月に妊娠し、6月に歌った場合、ウェルカムメッセージが表示されます。その後、妊娠の最初の8週間は記録に含まれていませんでした。つまり、34-8 = 26であるため、メールは9週目から始まります。数週間なので、ユーザーは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

ドープは妊娠の日付を指します。

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 の日付関数に固有であるため、より壊れやすいですが。

これを毎晩実行するようにスケジュールすると、34 週間にわたって 7 日ごとに電子メールが送信されます。

于 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 に答える