投稿日:2026/7/20
更新日:2026/7/20

Railsで Model 本体と Model::Callbacks を別クラスに分ける設計パターンのまとめ。
class Model < ApplicationRecordapp/models/model.rb にあるモデル本体ApplicationRecord(= ActiveRecord)を継承しているので、テーブルと1対1で対応するcreate! / find / update! などのDB操作の能力を持つclass Model::Callbacksapp/models/concerns/model/callbacks.rb に置くただのRubyクラスclass Model::Callbacks
class << self
def after_commit(record)
# コミット後に実行したい処理
end
end
end
:: の意味:: は名前空間の区切り。Model::Callbacks は「Modelという名前空間の中のCallbacksクラス」という意味になる。
モデル本体とは別ファイル・別クラスだが、「Model専用の付属品ですよ」ということを名前で表している。specの配置(spec/models/concerns/model/callbacks_spec.rb)もこのディレクトリ構造をミラーする。
モデル本体の1行がこの2つをつないでいる。
class Model < ApplicationRecord
after_commit Callbacks # コミット後に Model::Callbacks.after_commit(レコード) を呼べ、という配線
end
after_commit にクラスを渡すと、Railsはそのクラスのコールバックと同名のクラスメソッド(ここでは after_commit)を、対象レコードを引数にして呼び出す。
1ファイルに全部書くこともできるが、意図的に分離することで次のメリットがある。
callbacks_spec.rb として独立させられるModel = データとDB操作Model::Callbacks = 保存イベントに反応する処理この役割分担を規約として統一すれば、どのモデルでも同じ構造で読める。