プログラミング学習 備忘録

Railsを学習していく上での技術メモ。学んだことや解決したエラーなどを記録していきます。

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