Как отредактировать информацию из версий Paper Trail?
Для соответствия требованиям EUR 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 ответ
Для соответствия требованиям EUR 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
)