-
-
Notifications
You must be signed in to change notification settings - Fork 109
Description
背景
created_at の入力でTypoに気づかず、10年前の日付でデータを作成していた
❌ 2015-12-04
⭕️ 2025-12-04
cf. #1769
やりたいこと
今後同様の事象があったときのために対策をしたい
テストでキャッチして、通らないようにする- ID と同様に created_at は自動で挿入する
- すでに実現できているかも? (要: 動作確認)
- YAML の
created_atが未記入(もしくは項目なし)なら、データ読み込み時にIDと同様に更新されるかも?- 動作確認してみて、更新されるようならドキュメントの更新のみで解決できそう🙆♀️
- 更新されなかった場合も、「同様に created_at は自動で挿入」する形が間違いが起こらなくて良さそうです
- YAML の
作業チェック
- created_at も自動で挿入できるようにする
migrate_adding_id_to_yamlでcreated_atも書き出すよう修正 #1772 - ドキュメントの調整 📝 created_at を自動設定項目として明記し、入力ミスを防ぐ #1771
Investigate by AI
サッと AI に調べてみてもらったところ、 既に実装されてそうですのでドキュメントを更新するだけで大丈夫そう...!? 👀💡✨
⏺ Read(lib/tasks/dojos.rake)
⎿ Read 123 lines (ctrl+r to expand)
⏺ 重要な部分を見つけました!49行目を見ると:
d.created_at = d.new_record? ? Time.zone.now : dojo['created_at'] || d.created_at
現在の実装では:
1. 新規レコードの場合: Time.zone.now で現在時刻を自動設定
2. 既存レコードの場合: YAMLの created_at を使用、なければDB既存値を保持
つまり、新規Dojoには既に created_at が自動設定される仕組みがあります!既存の実装では新規登録時に YAML 内に created_at があっても無視されている (これでOK)
> What happens if it is new record and created_at is given in YAML?
⏺ 良い質問ですね!コードを詳しく見てみましょう。
49行目の処理:
d.created_at = d.new_record? ? Time.zone.now : dojo['created_at'] || d.created_at
この実装では:
新規レコード(d.new_record? が true)の場合:
- YAMLに created_at があっても無視されます
- 常に Time.zone.now(現在時刻)が設定されます
> No, don't change codes. created_at should be ignored for new records so that existing code is fine?
⏺ ああ、そうですね!既存のコードを見直すと:
d.created_at = d.new_record? ? Time.zone.now : dojo['created_at'] || d.created_at
これは正しい動作です:
- 新規レコード: 常に Time.zone.now(現在時刻)を使用 → YAMLの created_at は無視される
- 既存レコード: YAMLの created_at があればそれを使用、なければ既存の値を保持
つまり、新規Dojoでは created_at を入力させないというのが正しいアプローチです。これにより:
1. ✅ Typoによる間違った日付(2015年など)を防げる
2. ✅ 常に正確な登録日時が自動記録される
3. ✅ 人為的ミスを構造的に防げるMetadata
Metadata
Assignees
Labels
No labels