これは私の最初の投稿ですので、初心者の間違いを事前に謝罪します。私はこの問題のさまざまな解決策を研究しようとしましたが、これまで私の特別なケースに合っていると思われるものは見つかっていません。特定の日付の後3日ごとに通知メールを送信
私は個人がevaluations
を作成するには、アプリを持っている、と最小要件が7日created_at
日後に満たされていない場合、私は行動を取るためにそれらを促す3日ごとに通知メールを送信したいです。
reminders.rb
ファイルが3
から7.days
とReminders::LIMBO_EMAIL_INTERVAL_DAYS
セットにEvaluation::ASSESSMENTS_COMPLETION_WAIT_TIME
セットで、次のようになります。
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
私reminders_rspec.rb
は、この(最初のテストが失敗したと私はその理由を把握することはできません)のように見えます
context 'minimum number of peer assessments not in pending/complete and limbo email interval day' do
limbo_interval_array = Array.new(10) { |i| i*Reminders::LIMBO_EMAIL_INTERVAL_DAYS }
let!(:evaluation) { create(:evaluation, created_at: (Evaluation::ASSESSMENTS_COMPLETION_WAIT_TIME + limbo_interval_array.sample.days).ago) }
let!(:assessments) do
create_list(:assessment,
Evaluation::MINIMUM_NUM_PEERS,
evaluation: evaluation,
state: [:expired, :declined].sample)
end
it 'sends limbo email' do
expect { subject }.to change { ActionMailer::Base.deliveries.count }.by(1)
end
end
context 'on every non-third day since limbo' do
array = (1..20).to_a
limbo_interval_array = Array.new(10) { |i| i*Reminders::LIMBO_EMAIL_INTERVAL_DAYS }
non_limbo_interval_array = array - limbo_interval_array
let!(:evaluation) { create(:evaluation, created_at: (Evaluation::ASSESSMENTS_COMPLETION_WAIT_TIME + non_limbo_interval_array.sample.days).ago) }
let!(:assessments) do
create_list(:assessment,
Evaluation::MINIMUM_NUM_PEERS,
evaluation: evaluation,
state: [:expired, :declined].sample)
end
it 'sends nothing' do
expect { subject }.to change { ActionMailer::Base.deliveries.count }.by(0)
end
end
これを書く簡単な方法はありますか?これは私がやろうとしていることに対しては過度に複雑に思えますが、よりシンプルな方法を見つけることができませんでした。
私は多くのsh *** y最初の記事を見る。これはかなり大丈夫です。 +1あなたのため – m02ph3u5