Как отредактировать информацию из версий Paper Trail? - PullRequest
0 голосов
/ 22 мая 2018

Для соответствия требованиям GDPR ЕС (конфиденциальность пользователей) нам необходимо отредактировать личную информацию в версиях наших записей.Я придумал что-то, что, кажется, работает, но подумайте, я должен спросить, есть ли установленный способ сделать это.

class User < ActiveRecord::Base
  has_paper_trail
end

user = User.create! name: 'Josh'
user.update_attributes name: 'Josh2'
user.update_attributes name: 'Josh3'
user.destroy!

def self.get_data
  PaperTrail::Version.order(:id).where(item_id: 1).map { |ver| [ver.event, ver.object, ver.object_changes] }
end

# =====  BEFORE  =====
get_data
# => [["create", nil, {"id"=>[nil, 1], "name"=>[nil, "Josh"]}],
#     ["update", {"id"=>1, "name"=>"Josh"}, {"name"=>["Josh", "Josh2"]}],
#     ["update", {"id"=>1, "name"=>"Josh2"}, {"name"=>["Josh2", "Josh3"]}],
#     ["destroy", {"id"=>1, "name"=>"Josh3"}, nil]]

PaperTrail::Version.where_object_changes(name: 'Josh').each do |ver|
  ver.object['name'] = 'REDACTED' if ver.object && ver.object['name'] == 'Josh'
  if oc = ver.object_changes
    oc['name'] = oc['name'].map { |name| name == 'Josh' ? 'REDACTED' : name }
    ver.object_changes = oc
  end
  ver.save!
end

# =====  AFTER  =====
get_data
# => [["create", nil, {"id"=>[nil, 1], "name"=>[nil, "REDACTED"]}],
#     ["update",
#      {"id"=>1, "name"=>"REDACTED"},
#      {"name"=>["REDACTED", "Josh2"]}],
#     ["update", {"id"=>1, "name"=>"Josh2"}, {"name"=>["Josh2", "Josh3"]}],
#     ["destroy", {"id"=>1, "name"=>"Josh3"}, nil]]

ОБНОВЛЕНИЕ: На самом деле, я собираюсьнеобходимо также охватить запись ассоциацией, поэтому моего примера недостаточно.

1 Ответ

0 голосов
/ 30 мая 2018

Для соответствия требованиям GDPR ЕС (конфиденциальность пользователей) нам необходимо отредактировать личную информацию из версий наших записей.Я придумала что-то, что, кажется, работает, но думаю, мне следует спросить, есть ли установленный способ сделать это.

Нет, на сегодня, 2018-05-30, нетвстроенная функция или документированное решение для редактирования GDPR.

PaperTrail предоставляет множество способов перебора и запроса записей в таблице versions.where_object_changes - одна из таких функций, но она генерирует довольно сложный SQL.

where_object_changes(name: 'Joan')

SELECT "versions".*
FROM "versions"
WHERE .. ("versions"."object_changes" LIKE '%
name:
- Joan
%' OR "versions"."object_changes" LIKE '%
name:
-%
- Joan
%')

У вас могут быть обоснованные сомнения относительно правильности этого запроса.Фактически, начиная с PT 9.0.0 , использование where_object_changes для чтения YAML из текстового столбца приводит к ошибке на этот счет.Чтение JSON из текста или из столбца json/b все еще разрешено.

В любом случае, если мне удалось предупредить вас о таком сложном SQL, вам следует выбрать более простой подход, возможно, повторяющийся по всемзаписи версий для этого пользователя (user.versions.find_each)

...