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.