1
0
mirror of https://github.com/jbranchaud/til synced 2026-01-03 15:18:01 +00:00
Files
til/rails/mask-an-activerecord-attribute.md
2021-04-01 12:05:41 -05:00

40 lines
1.1 KiB
Markdown

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