3つの要素と2つの構造 でcreated_atが紹介されており、Repositoryの実装 では実際にcreated_atを生成しました。
イミュータブルデータモデルモデルにおいて、created_atはその時点のデータを参照するのに必要なためかなり重要度が高いものです。
ですが時間を扱うのは思いの外難しく、バグの原因になる可能性があります。
これは有名な問題のため対応方法は調べればすぐ出てきますが、保存した値と検索した値が違うことがあるため最初はびっくりします。
システムで使うタイムゾーンを統一すれば解決できます。
Repositoryの実装 でも紹介しましたが、扱うプログラム言語やRDBMSによってデフォルトの精度が違う場合があります。
この場合設定を変更するか、時間の切り捨てをすることで精度を合わせます。
可変な状態はソフトウェアの敵と考えているのですが、時間は常に変わり続けます。
現在時間を生成しても、次の瞬間には現在時間ではなくなってしまいます。
そのため、ある程度の精度で切って現在時間とする、というやり方をしなければいけません。
つまり、実際にデータがinsertされた時間とcreated_atは正確には同じ時間ではありません。
更に、プログラム上で何回も現在時間を生成しているとそれですら同じ値ではない可能性があります。
これを回避するために、Repository内での時間の生成は1回のみにするべきです。