2017-05-07 7 views
1

私は、データベースのPaymentsテーブルのXカラムが== '条件'であるときに電子メールを送信する最も簡単な方法を探してきました。基本的に私が望むのは、支払いを追加し、6ヶ月のような日付を設定することです。 6ヶ月が経過したら私はメールを送りたい。いつでもcronの仕事などを使うような多くのソリューションを見てきましたが、私のアプリケーションを軽く清潔に保つために、(おそらく外部ソースに頼らずにRailsを使って)最も簡単な方法を知りたいと思っています。私は、自動生成されたcreated_atを使って、x時間が経過したときを評価できると考えていました。Rails:Xが真のときにメールを送信する最も簡単な方法

+0

6か月後にXが真であるとき、またはXがtrueに変わったとき、または支払いイベントから6ヶ月後のときにメールを送信しますか? – mgamba

+0

支払いイベントから6ヶ月後に、「6ヶ月」はデータベースの列になり、変更される傾向があります。 – Dotol

答えて

2

「最も簡単な」方法は、ステートマシンと一緒にActive Jobを使用することです:

EmailJob.set(wait: 6.months).perform_later(user.id) if user.X_changed? 

これに伴う問題は、ジョブがすぐに処理されませんので、キューがジョブを蓄積することです。スキャンするジョブが増え、より多くのメモリを占有しているため、パフォーマンス上の問題が発生する可能性があります。

この種のジョブには、Cronジョブが適しています。ホスティングプラットフォームによっては、これを処理するさまざまな方法があります。たとえば、HerokuにはHeroku Schedulerがあります。

this SO answerなど、cronを使用しないで繰り返しタスクをスケジュールする方法は他にもあります。

編集:私はかつて「fist_of_fury」と呼ばれていた宝石を使用しましたが、現時点では維持されておらず、運用環境でどのように機能するかわかりません。以下は、私はレールのプロジェクトでそれを使用する方法についていくつかのスニペットです:アプリで

Gemfile

gem 'fist_of_fury' 
設定/初期化子/ fist_of_fury.rbで

# Ensure the jobs run only in a web server. 
if defined?(Rails::Server) 
    FistOfFury.attack! do 
    ObserveAllJob.recurs { minutely(1) } 
    end 
end 

/jobs/observe_all_job.rb

class ObserveAllJob 
    include SuckerPunch::Job 
    include FistOfFury::Recurrent 

    def perform 
    ::Task.all.each(&:observe) 
    end 
end 
+0

私はHerokuを使用していないので、情報をありがとう、私はすべての後cronジョブを使用すると思います。 – Dotol

+1

私は怒りの拳(https://github.com/facto/fist_of_fury)と呼ばれるこの宝石を一度使用したことを思い出しました。それはもはや維持されませんが、チェックアウトする価値があります – mgamba

2

電子メールを送信するためにdbに列があるので、datetimeデータ型にして、イベント支払いイベントが作成されるとすぐに電子メールの日付を設定できます。次に、レーキタスクを実行できます。

range = Time.now.beginning_of_day..Time.now.end_of_day 
Payment.where(your_datetime_custom_column: range).each do |payment| 
    payment.user.send_email 
end 

このタスクはスケジューラから毎日実行できます。

関連する問題