我目前的情况是,我有一个具有只读属性的模型,并且由于GDPR,我试图匿名化这些属性(意思是用无法识别的值更新它们)。Rails似乎不允许这样做(即使是通过覆盖#readonly?并返回false ),这是有意义的,因为为什么要更新不应该更新的属性,对吗?但有没有人有过类似的案子?如果是的话,请你去做吗?
模型
class Medium < ApplicationRecord
include Anonymous::ActiveRecord
attr_readonly :access_id, :medium_reference_id
def anonymize
if self.class.readonly_attributes.include?("access_id") #useless because always true
Medium.where(id: self.id).update_all(access_id: "#{self.id}_anonymized")
end
super
end
private
def anonymization_definitions
{
access_id: "#{self.id}_anonymized",
vehicle: "#{self.id}_anonymized",
}
end
end发布于 2021-02-09 14:18:11
你可以在数据库级别上这样做。使用connection.execute
random_id = SecureRandom.hex(9)
sql = <<~SQL
UPDATE mediums
SET access_id = #{random_id}
WHERE id = #{self.id};
SQL
ActiveRecord::Base.connection.execute(sql)这将更新有关的记录,绕过readonly属性。您可以将其放在中介模型上的实例方法中。
# app/models/medium.rb
def annonymize
# Statement from above
end然后可以被调用为
medium = Medium.find(<ID>)
medium.annonymize发布于 2021-02-09 07:25:34
最后我用了下面这一行。可能不是最好的,因为我想更新一条记录,但它不检查只读属性和工作目前。
Medium.where(id: self.id).update_all(access_id: "#{self.id}_anonymized")https://stackoverflow.com/questions/66097778
复制相似问题