Ruby on rails attr_encrypted-更新所有加密字段,尽管我只更改了一个

Ruby on rails attr_encrypted-更新所有加密字段,尽管我只更改了一个,ruby-on-rails,activerecord,devise,paper-trail-gem,attr-encrypted,Ruby On Rails,Activerecord,Devise,Paper Trail Gem,Attr Encrypted,我使用gem处理一些用户数据,例如: class User < ApplicationRecord attr_encrypted :name, key: Encryption['user_name'] attr_encrypted :date_of_birth, key: Encryption['user_date_of_birth'], marshal: true attr_encrypted :phone_number_home, key: Encryption['user

我使用gem处理一些用户数据,例如:

class User < ApplicationRecord
  attr_encrypted :name, key: Encryption['user_name']
  attr_encrypted :date_of_birth, key: Encryption['user_date_of_birth'], marshal: true
  attr_encrypted :phone_number_home, key: Encryption['user_phone_number_home']
  ...(some other encrypted attributes)...
end
这很奇怪,因为如果我只更新
name
字段,我只希望数据库中的
enc\u name
enc\u name\u iv
列被更新-它实际上与其他加密字段无关

更奇怪的是,
attr\u encrypted
似乎每次都为我上面描述的所有
enc*
属性生成一个新的集合。这种行为对我来说似乎是不对的

我的最终目标是使用
user.versions.last.changeset
跟踪对概要文件的更改,但正如您所想象的,它跟踪对
name
以外的其他字段的更改。我认为是
attr\u encrypted
导致了根本问题


有人想分享insight care吗?

您目前是否正在使用
纸质跟踪记录来跟踪更改?如果是这样的话,如果删除
paper\u trail
,这种行为会持续吗?@meagar是的,我只是再次尝试从模型中删除“has\u paper\u trail”行,然后直接从控制台更新模型。。。与您当前使用
纸质跟踪记录跟踪更改的内容相同吗?如果是这样的话,如果删除
paper\u trail
,这种行为会持续吗?@meagar是的,我只是再次尝试从模型中删除“has\u paper\u trail”行,然后直接从控制台更新模型。。。同样的事情
[13] pry(main)> u.changes
=> {"enc_name_iv"=>["T\xD2K\x9C<6\xFC\xAA\x0F\fB?", "U\xCA\xAEB\xFA\x9E\xF3-6\x10\x0E\xBB"],
 "enc_name"=>["\xE1\xDA\xAA\xE3\xB6\xEF\xFEY\x06%ea(\xFC\xA1*\x19?\x96\f&1\x84@\xB8H", "x\xAD.\xA2$z\x11\x00\xC7\xCF\xE3\x87i\xC67\x87X\a\xFD\xFE\x84\xA5~4\x97\x8F"],
 "name"=>["newer name", "newww name"]}

[14] pry(main)> u.save
   (0.2ms)  BEGIN
  SQL (0.3ms)  UPDATE `users` SET `updated_at` = '2017-11-21 20:02:46', `enc_phone_number_home_iv` = x'12cb508e6f2f424196bed890', `enc_phone_number_home` = x'e4bb27954300421cd68fe70f586bd0cef1035d87897e806fbade', `enc_phone_number_mobile_iv` = x'102293734d15da4355264d06', `enc_phone_number_mobile` = x'5343f3c82b47d01fe3f84e20b667f031cb204cd63ada79fd653e', `enc_emergency_contact_phone_iv` = x'1ac5948b7ce93694740cbb10', `enc_physician_phone_number_iv` = x'f9855025778ef564d2a4aad2', `enc_name_iv` = x'55caae42fa9ef32d36100ebb', `enc_name` = x'78ad2ea2247a1100c7cfe38769c637875807fdfe84a57e34978f' WHERE `users`.`id` = 29