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
以上です。
▼この記事がいいね!と思ったらブックマークお願いします