diff --git a/lib/attr_encrypted.rb b/lib/attr_encrypted.rb index 3bfa87c9..8e8e3943 100644 --- a/lib/attr_encrypted.rb +++ b/lib/attr_encrypted.rb @@ -159,8 +159,11 @@ def attr_encrypted(*attributes) end define_method("#{attribute}=") do |value| - send("#{encrypted_attribute_name}=", encrypt(attribute, value)) - instance_variable_set("@#{attribute}", value) + old_value = instance_variable_get("@#{attribute}") + if old_value.nil? || old_value != value + send("#{encrypted_attribute_name}=", encrypt(attribute, value)) + instance_variable_set("@#{attribute}", value) + end end define_method("#{attribute}?") do diff --git a/test/attr_encrypted_test.rb b/test/attr_encrypted_test.rb index 0afbd37c..6b4c5335 100644 --- a/test/attr_encrypted_test.rb +++ b/test/attr_encrypted_test.rb @@ -463,4 +463,13 @@ def test_should_not_by_default_generate_iv_when_attribute_is_empty user.with_true_if = nil assert_nil user.encrypted_with_true_if_iv end + + def test_should_not_generate_iv_if_same_value + user = User.new + assert_nil user.encrypted_email_iv + user.email = 'thing@thing.com' + refute_nil(old_value = user.encrypted_email_iv) + user.email = 'thing@thing.com' + assert_equal old_value, user.encrypted_email_iv + end end