Railsでイベントの通知をモデリングする

Railsでイベントの通知をモデリングしてみました。

環境
Ruby 3.3.1
Rails 8.0.0.rc1

通知(Notification)モデルに予定日時(scheduled_at)と処理済み(processed)フラグを持つ。
処理前かつ予定時刻になったら通知処理を行う(notify)。例えばメール送信を実装する。
ただし、処理前でも予定日時から1日過ぎたら対象外にする。通知の対象は予定日時から1日間だけ。
運用時は定期的に上記の通知処理を行う。例えば10分に1回。

アプリを作成する。


rails new shirase
cd shirase

通知の足場(scaffold)を生成する。


bin/rails generate scaffold Notification scheduled_at:datetime processed:boolean

processed にデフォルト値 false と非NULL制約を追記する。


db/migrate/..._create_notifications.rb
  t.boolean :processed, default: false, null: false

データベースをマイグレートする。


bin/rails db:migrate

ルーティングのルートを通知一覧ページに設定する。


config/routes.rb
  root "notifications#index"

通知モデルに通知対象のスコープ(scope :waited)と通知メソッド(self.notify)を実装する。


app/models/notification.rb
class Notification < ApplicationRecord
  # 処理前でも予定日時から1日過ぎたら対象外。
  scope :waited, -> { where(processed: false, scheduled_at: 1.day.before..Time.current) }

  def self.notify
    waited.each do |item|
      # TODO
      item.update! processed: true
    end
  end
end

アプリのサーバーを起動する。


bin/rails server

まだ通知は存在しないため一覧に表示されない。

今回はコンソールで通知の作成と通知処理を行う。
アプリのコンソールに入る。


bin/rails console

処理前で予定日時が1時間前(過去)の通知を作成する。
処理対象であることを確認する。


Notification.waited.count # => 0
Notification.create! processed: false, scheduled_at: 1.hour.before
Notification.waited.count # => 1

処理前で予定日時が1時間後(未来)の通知を作成する。
処理対象の件数は変わらない。


Notification.waited.count # => 1
Notification.create! processed: false, scheduled_at: 1.hour.after
Notification.waited.count # => 1
Notification.count # => 2

通知する。
処理対象は0件になる。
コンソールを抜ける。


Notification.notify
Notification.waited.count # => 0
exit

以上です。



▼この記事がいいね!と思ったらブックマークお願いします
このエントリーをはてなブックマークに追加