Rails 用の既読/未読管理 Gem は色々ありますが、専用のテーブルが必要だったりとやや重量級の Gem が多かったので、軽量でシンプルな既読/未読管理用の Gem を作りました。

そして作った Gem はいまお手伝いしている Findy さんに寄贈しました。

Findy/shiroyagi: Read/Unread status management module for ActiveRecord

Shiroyagi の名前の由来は「やぎさんゆうびん」という童謡からとりました。黒ヤギさんが白ヤギさんからの手紙をむしゃむしゃ食べまくる、皆さんご存知の童謡です。

少し解説

できるかぎり小さく、最小限の機能にしたかったので、該当のモデルのレコードが既読状態なのか未読状態なのかのみを管理することにしました。

当初は状態管理用のフラグを作り、既読状態であればフラグを立てるという方式で作り始めましたが、せっかくなので既読状態にした日時が分かるようにし、その日時の有無で状態管理をするようにしました。

結果として DATETIME 型の read_at というカラムを既読/未読管理を行いたいモデルのテーブルに追加するという形になりました。

メインのモジュールには既読/未読周りで一般的に使われるであろうメソッドを実装しました。

  • 既読状態のレコードを取得する
  • 未読状態のレコードを取得する
  • 既読状態のレコードの件数を取得する
  • 未読状態のレコードの件数を取得する
  • 一括で既読状態にする
  • 一括で未読状態にする
  • 対象のオブジェクトのみを既読状態にする
  • 対象のオブジェクトのみを未読状態にする
  • 対象のオブジェクトが既読状態か調べる
  • 対象のオブジェクトが未読状態か調べる

Gem をインストール後、既読/未読管理を行いたいモデルに DATETIME 型の read_at カラムを追加し、そのモデルで include Shiroyagi::ActsAsShiroyagi でモジュールを差し込むことで動作します。

read_at カラムにはインデックスを作った方がいいので、インデックス作成もお忘れなく。

詳しくは リポジトリ をご覧ください。

積み残しとか

状態管理用のカラムの名前が read_at で固定なので、これは設定で変えられるようにしたいです。

あとはカラム追加用のマイグレーションファイルのジェネレータなんかもあったら便利だなーと思ってたりします。

用途が合えばぜひ使ってみてください!