知りたかったこと

  • モデルが登録・更新・削除されたとき(DBにコミットされたとき)に処理を挟み込む方法
  • コールバックの中で変更された情報にアクセスする方法

見たサイト

わかったこと

  • データベースにコミットされたあとに処理を実行するには、after_commitを使う。
  • データベースへのコミットはinsert,update,deleteなど色々あり、全てafter_commitに入ってきてしまうので、on: :createなどを付けて必要なタイミングに絞る。
  • よく使うものにはエイリアスが用意されている。
    • after_create_commit
    • after_update_commit
    • after_destroy_commit
  • after_update_commitの中でどんな変更が行われたかを知るためには、previous_changesメソッドを使う。

datetime型のattend_atというフィールドがnilからある時刻にセットされたときに処理を行うサンプル

if self.previous_changes.include?(:attend_at) &&
  self.previous_changes[:attend_at][0].nil? &&
  self.previous_changes[:attend_at][1].present?
  # 行いたい処理
end
  • after_delete_commitの中では、削除済みなのでレコードにアクセスできないのでは?と思ったが普通にアクセスできる模様。
after_delete_commit do
  # 削除されたレコードのIDを取得
  puts self.id
end

所感

RailsではActiveRecordがデータベースとアプリケーションを繋いでくれています。しかし、データベースの仕組みをしっかりと知っておかないと、エラーが起きたときにデータの不整合が起こってしまったり、ログに結果が正しく残らなかったりして困ることになります。結局は便利なフレームワークもきっかけに過ぎず、ちゃんとした勉強は必要ですね。