mirror of
https://github.com/jbranchaud/til
synced 2026-01-03 15:18:01 +00:00
40 lines
1.1 KiB
Markdown
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.
|