module EncryptableConcern extend ActiveSupport::Concern class_methods do def attr_encrypted(*attributes) attributes.each do |attribute| define_method("#{attribute}=".to_sym) do |value| self.public_send( "encrypted_#{attribute}=".to_sym, EncryptionService.new.encrypt(value) ) end define_method(attribute) do value = self.public_send("encrypted_#{attribute}".to_sym) EncryptionService.new.decrypt(value) if value.present? end end end end end