> For the complete documentation index, see [llms.txt](https://ploegert.gitbook.io/til/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ploegert.gitbook.io/til/programmy/rails/mask-an-activerecord-attribute.md).

# 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.

```ruby
> 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.

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

This uses the [`#read_attribute`](https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Read.html#method-i-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.

```ruby
> 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.
