Rails/ActiveRecordのtimestamps(created_at/updated_at)の実装を読んでみた

スポンサーリンク

Rails(正しくは ActiveRecord ですが)の created_at, updated_at は、DBレコードを作成・更新した日時を自動で記録してくれるのでとても便利です。

Swift による iOS 開発で CoreData を使う際に、Rails の ActiveRecord のようにレコード保存で自動更新される created_at, updated_at カラムの機能を実装したかったので、t.timestamps メソッドとそれで作成される created_at, updated_at カラムの実装周りのソースコードを読んでみました。コードリーディングの練習も兼ねてます^^

CoreDataでcreated_at/updated_atの日付データを自動作成 | EasyRamble

— 環境 —
Rails 4.1
activerecord-4.1.1

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

マイグレーション中の t.timestamps の実装

Rails のマイグレーションファイルの中で、以下のように t.timestamps と書いておけば、DBレコードの追加・更新で自動更新される created_at, updated_at カラムを作成してくれます。

まずは、この t.timestamps の実装からコードリーディングを開始しました。Rails プロジェクトのディレクトリに移動後…

これで activerecord のディレクトリをエディタで開けます。

lib/active_record/connection_adapters/abstract/schema_definitions.rb

394行目辺り。

add_timestamps については、SchemaStatements#add_timestamps を見ろとコメントにあるのでそれを読む。

lib/active_record/connection_adapters/abstract/schema_statement.rb

あった。721行目辺り、ここで add_column を呼び出して created_at, updated_at のカラムが追加されてますね。

t.timestamps についてはとりあえずここまで。

created_at, updated_at の実装

続いて、実際にレコードが追加・更新される際の、created_at, updated_at の自動更新機能の実装を見てみます。

lib/active_record/timestamp.rb

まずは、レコードが作成(create)される場合の、created_at, updated_at の実装。46行目〜。

なるほど〜。all_timestamp_attributes メソッドで、timestamp に関するカラムを each で回して、そのモデルが timestamp のカラムを持っていて、かつ値が空(nil)の場合に write_attribute で属性に値(現在の日時)を書き込んでいます。Rails のソースコードはメタプログラミングが使われている箇所以外は読みやすいです。

all_timestamp_attributes メソッドについては以下。89行目〜。

created_at, updated_at の他 created_on, updated_on も timestamp 用のカラムとして扱われるようです。

続いて、レコードが更新(update)される場合の、created_at, updated_at の実装。60行目〜。ソースを追うと分かりますが、created_at については update では何もしない。

レコードのタイムスタンプが有効(if should_record_timestamps?)の場合に、タイムスタンプ更新用のカラムを timestamp_attributes_for_update_in_model で取得して each で回し、write_attribute でタイムスタンプ値を現在の日時に更新する処理が書かれています。

timestamp_attributes_for_update_in_model の実装は以下。81行目。

以上で、ActiveRecord の created_at, updated_at 周りの実装がおおかた理解できました。今回のコードリーディングはここまでです。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
 
スポンサーリンク

Leave Your Message!