Mask An ActiveRecord Attribute

Let's say we have a User model with backing table that has an email attribute.

If we look up a User record, we can grab its email because Rails provides an accessor to that attribute under the hood.

> user.email
'Liz.Lemon@example.com'

We can write a custom #email method on User to mask that attribute. We could do this for any number of reasons. One might be to always downcase the email before retrieving it and using it througout app code.

class User < ApplicationRecord
  def email
    read_attribute(:email).downcase
  end
end

This uses the #read_attribute method which retreives the type casted value before hitting the accessor method. We have to do this, rather than calling #email directly, because that would result in an infinite loop.

> user.email
'liz.lemon@example.com'

I'd probably handle this email scenario at the DB-layer. Nevertheless, this demonstrates a technique we can use in a variety of scenarios at the Rails-layer.

Last updated