Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在特定日期后每三天发送提醒电子邮件_Ruby On Rails_Ruby On Rails 4_Rspec_Rspec Rails - Fatal编程技术网

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给你