Ruby on rails 在特定日期后每三天发送提醒电子邮件
这是我的第一篇帖子,所以对于任何新手的错误,我都要提前道歉。我试过研究解决这个问题的不同方法,到目前为止还没有找到一种适合我的情况 我有一个应用程序,其中个人创建Ruby on rails 在特定日期后每三天发送提醒电子邮件,ruby-on-rails,ruby-on-rails-4,rspec,rspec-rails,Ruby On Rails,Ruby On Rails 4,Rspec,Rspec Rails,这是我的第一篇帖子,所以对于任何新手的错误,我都要提前道歉。我试过研究解决这个问题的不同方法,到目前为止还没有找到一种适合我的情况 我有一个应用程序,其中个人创建评估,如果在日期创建后7天未满足最低要求,我希望每3天发送提醒电子邮件,提示他们采取行动 remenders.rb文件如下所示,其中Evaluation::assessment\u COMPLETION\u WAIT\u TIME设置为7.days,而remenders::LIMBO\u EMAIL\u INTERVAL\u days设
评估
,如果在日期创建后7天未满足最低要求,我希望每3天发送提醒电子邮件,提示他们采取行动
remenders.rb
文件如下所示,其中Evaluation::assessment\u COMPLETION\u WAIT\u TIME
设置为7.days
,而remenders::LIMBO\u EMAIL\u INTERVAL\u days
设置为3
:
def self.send_peer_shortage_notifications
time = Time.current - Evaluation::ASSESSMENTS_COMPLETION_WAIT_TIME
range = time..Time.current
today = Time.current.to_date
evaluations = Evaluation.arel_table
assessments = Assessment.arel_table
left_join = evaluations
.join(assessments, Arel::Nodes::OuterJoin)
.on(evaluations[:id].eq(assessments[:evaluation_id]),
assessments[:state].in([:pending, :complete]),
assessments[:assessor_id].not_in([evaluations[:user_id],
evaluations[:manager_id]]))
.join_sources
relation = Evaluation
.in_process
.joins(left_join)
.where(created_at: range)
.group(:user_id)
.having(evaluations[:user_id].count.lt(Evaluation::MINIMUM_NUM_PEERS))
relation.find_each do |evaluation|
days_in_limbo = (today - (evaluation.created_at + Evaluation::ASSESSMENTS_COMPLETION_WAIT_TIME).to_date).to_i
if days_in_limbo % Reminders::LIMBO_EMAIL_INTERVAL_DAYS == 0
EvaluationMailer.delay.limbo_notification(evaluation)
end
end
end
我的提醒\u rspec.rb
如下所示(第一次测试失败,我不知道原因):
有没有更简单的方法来编写和测试这个?对我来说,这似乎太复杂了“我试着去做,但我还没有找到一个更简单的方法。事实上,你似乎让事情变得比需要的更复杂了。这里的关键是您希望使用队列后端异步发送电子邮件通知。由于提醒将在创建评估后7天发送,因此延迟的电子邮件将排队等待评估控制器的创建操作:
class EvaluationsController < ApplicationController
def create
# Do whatever it is you do to create an evaluation
if @evaluation.valid?
EvaluationMailer.delay_for(7.days).limbo_notification(evaluation.id) # Pass an ID rather than a model object, and use `find_by` within `limbo_notification`
# redirect or whatever...
end
end
class EvaluationsController
现在,所有的艰苦工作都将由您的队列后端ActiveJob
完成,它将在7天后自动为您发送电子邮件
排队后端是一个很大的主题,我将在这里向您介绍文档,而不是详细说明它们是如何工作的:。对于特定的队列后端,我建议使用Redis的Sidekiq。事实上,您似乎正在使其变得比需要的更复杂。这里的关键是您希望使用队列后端异步发送电子邮件通知。由于提醒将在创建评估后7天发送,因此延迟的电子邮件将排队等待评估控制器的创建操作:
class EvaluationsController < ApplicationController
def create
# Do whatever it is you do to create an evaluation
if @evaluation.valid?
EvaluationMailer.delay_for(7.days).limbo_notification(evaluation.id) # Pass an ID rather than a model object, and use `find_by` within `limbo_notification`
# redirect or whatever...
end
end
class EvaluationsController
现在,所有的艰苦工作都将由您的队列后端ActiveJob
完成,它将在7天后自动为您发送电子邮件
排队后端是一个很大的主题,我将在这里向您介绍文档,而不是详细说明它们是如何工作的:。对于一个特定的队列后端,我建议使用Redis的Sidekiq。我看到很多关于sh***y的文章。这个看起来还不错+对你来说,我看到了很多第一次发的帖子。这个看起来还不错+1给你