WheneverとActionMailerを両方使って定期通知メールを実装
表題の通り、Wheneverというgemとrailsの機能であるActionMailerを使って1日1回、記事の公開状況がメールで送られるように既存のアプリに修正を加えました。
wheneverとActionMailerについては以前扱ったことがあるので割愛し、解答例と違ったところや学んだことを記します。
自分が書いた最初のコード
class ArticleMailer < ApplicationMailer default from: 'from@example.com' def report_summary @articles = Article.all @yesterday_articles = @articles.yesterday_published mail(to: 'admin@example.com', subject: '公開済記事の集計結果') end def yesterday_published from = Date.yesterday.beginning_of_day to = Date.yesterday.end_of_day where(published_at: from...to) end end
昨日公開された記事を取得するyesterday_published
メソッドをArticleMailer内に定義し、report_summaryのコードを簡潔にしようとしたがうまく動かず。
結局下のようにベタ書きすることで実装した。
class ArticleMailer < ApplicationMailer default from: 'from@example.com' def report_summary from = Date.yesterday.beginning_of_day to = Date.yesterday.end_of_day @articles = Article.all @yesterday_articles = @articles.where(published_at: from...to) mail(to: 'admin@example.com', subject: '公開済記事の集計結果') end
解答例を確認したところ下のようになっていた。
class ArticleMailer < ApplicationMailer def report_summary @published_article_count = Article.published.count @articles_published_at_yesterday = Article.published_at_yesterday mail(to: 'admin@example.com', subject: '公開済記事の集計結果') end end
# models/article.rb内 scope :published_at_yesterday, -> { where(published_at: 1.day.ago.all_day) }
1.day.ago.all_day
で昨日1日を絞り込んでいた。
Railsにおける時間を扱うメソッドについては、以下の記事が非常に参考になった。
RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い - Qiita