動物病院などで利用する診療管理システムでは、犬や猫の診療記録、血液検査結果、投薬履歴などのデータを正確に保存し、いつ誰がどのような変更を行ったのか追跡できる仕組みが重要になります。Ruby on Railsでこのようなシステムを構築する場合、Active Recordのトランザクション機能と監査ログを組み合わせることで、変更履歴の保存や不正な改変の検知に対応できます。この記事では、医療系データに近い高い信頼性が求められる診療データ管理システムの設計方法を解説します。
診療記録システムで変更履歴管理が必要な理由
犬の診療記録では、体重、症状、血液検査値、診断結果、処方された薬など、多くの重要な情報を扱います。
例えば、過去の血液検査結果が誤って変更された場合、現在の治療方針や薬の投与量を判断する際に影響する可能性があります。そのため、単純に現在の値だけを保存するのではなく、過去の状態を確認できる仕組みが必要です。
特に医療や健康に関わるデータでは、「誰が」「いつ」「何を」「どのように変更したか」を記録する監査証跡(Audit Trail)が重要になります。
Active Recordトランザクションでデータ更新の整合性を保証する
Ruby on Railsでは、複数のデータ更新を一つの処理単位として扱うためにActive Recordのトランザクションを利用できます。
例えば、診療記録を更新する場合、診療テーブルへの変更と監査ログへの記録を同時に成功させる必要があります。片方だけ保存される状態になると、履歴の信頼性が失われます。
以下のような処理にすることで、診療データ更新と監査ログ保存を一体化できます。
ActiveRecord::Base.transaction do
medical_record.update!(attributes)
AuditLog.create!(
record_type: "MedicalRecord",
record_id: medical_record.id,
action: "update",
user_id: current_user.id
)
end
この場合、診療記録の更新に失敗した場合は監査ログも保存されません。逆に監査ログ保存に失敗した場合も診療データの更新が取り消されます。
監査ログテーブルを設計して変更履歴を保存する
監査ログでは、変更前と変更後の情報を保存できるように設計すると、後から詳細な確認ができます。
例えば以下のようなカラムを持つaudit_logsテーブルを作成します。
| カラム | 用途 |
|---|---|
| id | 監査ログID |
| user_id | 変更を行ったユーザー |
| record_type | 対象データの種類 |
| record_id | 対象データID |
| action | create/update/deleteなどの操作 |
| before_data | 変更前のJSONデータ |
| after_data | 変更後のJSONデータ |
| created_at | 変更日時 |
例えば、犬の血液検査結果でALT値を100から80へ修正した場合、「変更前の値」と「変更後の値」を保存しておけば、後から変更理由を確認できます。
改ざん検知のためにハッシュ値を利用する
監査ログを保存するだけでは、管理者権限を持つユーザーがログ自体を書き換える可能性があります。そのため、より高い信頼性が必要な場合はハッシュ値を利用します。
保存する監査ログごとにハッシュ値を計算し、前のログのハッシュ値を次のログ計算に含めるチェーン方式にすると、途中の変更を検知しやすくなります。
例えば以下のような構造です。
ログ1
データ + ハッシュ値A
ログ2
ログ1のハッシュ値A + データ + ハッシュ値B
ログ3
ログ2のハッシュ値B + データ + ハッシュ値C
もしログ1を書き換えると、その後に保存されたログのハッシュ値と一致しなくなるため、不正な変更を発見できます。
Railsで監査ログを実装する方法
Railsでは監査ログ機能を自作する方法のほか、専用のGemを利用する方法もあります。
代表的な方法として、モデルの変更履歴を自動保存する仕組みを導入できます。ただし、診療データのように重要度が高い情報では、単純な履歴保存だけではなく、ユーザー認証情報や操作理由なども記録すると安全性が向上します。
例えば投薬履歴を変更する場合、「獣医師Aが2026年8月16日10時30分に、薬剤名を変更した。理由は体重増加による投与量調整」という情報まで残せる設計にすると、後から判断根拠を確認できます。
データベース側の監査機能も活用する
アプリケーション側のログだけではなく、データベースの監査機能を利用する方法もあります。
データベース監査ログでは、Railsを経由しない直接操作や管理者による変更も記録できます。
重要な診療データでは、Rails側の監査ログとデータベース側の監査ログを組み合わせることで、より強固な追跡環境を構築できます。
診療データ管理システムで注意すべきセキュリティ設計
診療記録のような重要データでは、履歴管理だけでなくアクセス制御も必要です。
例えば、受付スタッフは予約情報のみ編集可能、獣医師は診療記録を編集可能、管理者はシステム設定のみ変更可能というように権限を分けることで、不必要な変更を防げます。
また、監査ログ自体は通常ユーザーが削除できない領域に保存し、定期的にバックアップを取得することも重要です。
まとめ
Ruby on Railsで犬の診療記録や血液検査値、投薬履歴を管理するシステムを構築する場合、Active Recordのトランザクションと監査ログを組み合わせることで、データ更新の整合性と変更履歴の追跡性を高めることができます。
さらに、監査ログへ変更前後のデータを保存し、ハッシュチェーンなどの改ざん検知技術を加えることで、履歴の信頼性を向上できます。
診療データのように長期間正確な管理が必要な情報では、単に最新状態を保存するだけではなく、「過去に何が起きたか」を証明できる設計にすることが重要です。


コメント