1
0

More than 3 years have passed since last update.

[Ruby on rails]バッチ処理で通知の定時削除 通知の未読連絡のメール作成

Last updated at Posted at 2021-08-19

初めに

今回バッチ処理を実装しました。
以下はイメージ画像です。
何日で通知を削除するのがベストなのか定まってなくてすみません・・・。

スクリーンショット 2021-08-19 17.50.23.png

スクリーンショット 2021-08-19 17.47.44.png

バッチ処理って何?

一定期間経ったらデータを消してくれる機能だと思ってたのですが、
もっと色々なことができるんですね:point_up:
1日1回何時とか、2分起き〜とかに、あらかじめ定めた処理を行ってくれます。
今回行ったのは、1日1回30日前の通知のデータを消すという作業と、
1日1回未読の通知チェックしてあれば、リマインドメールのようなものを送るというような作業です。
閲覧履歴とか作っていればそこでもバッチ処理使えたな〜と思いました。

通知機能の実装

通知機能の実装は以下の記事の通りです。

メーラー作成

以下を参考に作成しました。

コード(環境変数使用してます)

環境変数化(セキュリティ対策)については以下の記事です。

https://qiita.com/ki_87/items/82b28f89a8552506a169

class ApplicationMailer < ActionMailer::Base
  default from: ENV['KEY']
  layout 'mailer'
end
class ScheduledProcessingMailer < ApplicationMailer

    def check_notice_mail

    users_with_unckecked_notices = User.all.select do |user|
      user.passive_notifications.where(visited_id: user.id, checked: false).count >= 5
    end

    users_with_unckecked_notices_mails = users_with_unckecked_notices.pluck(:email)

    mail(subject: "未読の通知が5件以上あります ※通知は30日で自動削除されます", bcc: users_with_unckecked_notices_mails)
    end
end
check_notice_mail.text
===============================
現在、~~に未読の通知が5件以上あります。
===============================

通知は30日で自動削除されてしまいすので、
ご確認お願いします。



 今後とも よろしくお願いいたします。

※このメールは送信専用です。
===============================
===============================

Gemの追加 

Gemfile
gem 'whenever', require: false
ターミナル
bundle install
ターミナル
bundle exec wheneverize

まずは処理を書く

やってほしい処理を書きます。
app/lib/batch/data_reset.rbを作成します。
batchフォルダも、ファイルも手作りです。

正直ファイル名をミスったなあと思います・・・。
あと処理が二つならファイルも分けるべきだったのかな。。とも思います。

app/lib/batch/data_reset.rb
class Batch::DataReset
  def self.data_reset
    # 投稿を全て削除
    Notification.where("created_at < ?", 30.days.ago.beginning_of_day).delete_all
    p "30日前の通知を全て削除しました"
  end

  def self.data_notice
    ScheduledProcessingMailer.check_notice_mail.deliver_now
    p "未読通知をメールしました"
  end
end

このファイルを読み込めるように、config/application.rbに以下追記します。
ついでにタイムゾーンも東京にします。

config.paths.add 'lib', eager_load: true
config.time_zone = 'Tokyo'

決まった時刻に起動する処理を書く

上でやったbundle exec wheneverizeのコマンドで、
config/schedule.rbが作成されるかと思いますので、
以下を追記します。

config/schedule.rb
env :PATH, ENV['PATH']
set :output, 'log/cron.log'
set :environment, :development
 every 1.minutes do
  # every 1.days, at: '0:10 am' do
    runner "Batch::DataReset.data_reset"
 end

# every 1.days, at: '0:10 am' do
every 1.minutes do
     runner "Batch::DataReset.data_notice"
end

動作確認しやすいように、1日1回の処理をコメントアウトし、
1分毎起動するようにしてあるので注意してください!!

PATH, ENV['PATH']環境変数は特に定義してませんが、、
これを書かないとエラーになるそうです。
set :output, 'log/cron.log'ここにバッチ処理の履歴が入ります。
set :environment, :development
本番環境では、ここを:developmentではなく、
:productionにする必要があります!!
あとは、1日1回何時に、何を行うか〜の記述ですが、
app/lib/batch/data_reset.rbに書いた作業を呼び出しています。

以下を実行しバッチ処理の内容を反映しましょう。
処理内容更新したら毎回実行する必要があると思います。

bundle exec whenever

スクリーンショット 2021-08-19 19.17.02.png

bundle exec whenever --update-crontab

以下のように出力があるかと思います!
[write] crontab file updated

起動と停止

以下のコマンドで処理が起動します。
未読の通知をたくさん用意しておきます。

sudo systemctl start crond

以下のコマンドで実行結果が見れます。

sudo tail -f log/cron.log

スクリーンショット 2021-08-19 18.52.12.png

なんだか他のながーい記述があればエラーです。
私は、メーラーのviewファイルの名前を間違えていてエラーが出てしまいました・・・。

停止は以下のコマンドです。

sudo systemctl stop crond
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0