2012-07-04 2 views
0

루비에 새 윈도우 xp와 레일 3을 사용하여 34 일 동안 7 일마다 사용자에게 이메일을 보내고 싶습니다. 7 일마다 이메일을 보내는 usermailer도 있습니다. 34 주 동안 ??등록일로부터 34 주 동안 이메일을 보내십시오.

난 사용자 메일러가 사용자에게 이메일을 보내, 나는 이메일을 7 일마다 을 보내고 내가 어떤 주 알고 싶어
도 또한 Windows 작업 스케줄러를 사용하여 배치 파일에서 호출하는 방법을 정의 사용자가 지금 ??

예 : 사용자가 4 월에 임신하여 6 월에 노래를 부른 다음 환영 메시지가 표시되면 임신 8 주째가 기록에 없습니다. 즉, 이메일은 주 번호 9부터 시작합니다. - 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 임신 날짜를 참조한다.

+0

, 문제가 무엇에 코드 한 줄을 추가하여 그것을 해결? –

+0

34 주 동안 7 일마다 이메일을 보내려고합니다 –

+0

문제는 34 주 동안 유지하는 방법입니다 ?? –

답변

0

환경을 기반으로, 순수 루비 솔루션은 다음과 같을 것이다 :

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 일마다 이메일을 발송합니다.

+0

julianday 무엇입니까 ?? 그것은 GMT와 관련이 있습니까 ?? –

+0

이 방법은 내가 원하는 것입니다. 왜냐하면 사용자가 자신의 날짜를 편집하면 수정 날짜가 아직 변경되지 않기 때문입니다. –

+0

어쩌면 다음과 같은 것을 사용할 수 있습니다. dop.where date.to_time = time.now - 238.day –

0

i`ve 내 클래스 메소드 그래서

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 
+0

34 개의 이메일을 일주일에 한 번 보내려면 "dop.date.to_time <= Time.now - 7.day " 작동 안 할 것이다. 내가 읽었을 때, 첫 번째 주에 이메일을 보낼 것이지만, 두 번째 주는 그 조건을 충족시키지 못할 것입니다. –

+0

나는 배치 파일로 호출 한 다음 배치 스케줄러에 배치 파일을 넣는다. –

관련 문제