ActiveRecord::Bitemporal
概要
履歴を残して更に修正もしたいようなデータモデルを実現したい
操作感はほぼActiveRecordと同じ
仕組み
削除されていないか(transaction)の判定
有効かどうか(valid)の判定
idをbitemporal_idに読み替え
hiroki.iconシステム操作的な履歴(transaction)とデータ上有効な履歴(valid)と2軸の履歴ができて2次元になるのが分かりづらいポイント
何もしなくてもBitemporalを考慮したWhere条件などが付与される
例: WHERE "employees"."valid_from" <= '2019-10-25 07:56:06.731259' AND "employees"."valid_to" > '2019-10-25 07:56:06.731259' AND "employees"."transaction_to" = '9999-12-31 00:00:00'
バイテンポラルデータモデルにおける削除
有効期間外になること
システム期間外になること
バイテンポラルデータモデルにおける修正
一個前の有効なレコードをコピーしてきて、新しく修正後のレコードを積み上げるイメージ
どの自国のレコードをベースとするのかは要件によって挙動が変わる
バイテンポラルデータモデルにおける検索
有効時刻、システム時刻を考慮して検索を行う
/icons/hr.icon
基本操作
.valid_at(datetime)
有効な時間で検索
.find_at_time(datetime, id)
find + .valid_at
.transaction_at
システム時間で検索
.ignore_valid_datetime
時間指定を無視する
validがなくなる
hiroki.icon現在システム的に有効なレコード(論理削除されていないレコード)を全部持ってくる。bitemporal的なイメージで言うと横一行がっと持ってくるイメージ
Employee.ignore_valid_datetime.to_sql→ SELECT "employees".* FROM "employees" WHERE "employees"."transaction_to" = '9999-12-31 00:00:00'
.ignore_bitemporal_datetime
validとtransactionを完全に無視する
.ignore_valid_datetime.within_deletedと同じ意味?
.within_deleted
論理削除されているレコードを含める
transactionがなくなる
Employee.within_deleted.to_sql→ SELECT "employees".* FROM "employees" WHERE "employees"."valid_from" <= '2019-01-20 00:00:00' AND "employees"."valid_to" > '2019-01-20 00:00:00'
.without_deleted
論理削除されているレコードを含めない
全レコードを対象にする場合
Employee.ignore_valid_datetime.within_deleted.to_sql
.ignore_valid_datetime(valid時間指定を無視する) + .within_deleted(論理削除を含める)
/icons/hr.icon
参照