diff --git a/README.md b/README.md index 3c0a0f6..047269d 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ pairing with smart people at Hashrocket. For a steady stream of TILs, [sign up for my newsletter](https://tinyletter.com/jbranchaud). -_1104 TILs and counting..._ +_1105 TILs and counting..._ --- @@ -694,6 +694,7 @@ _1104 TILs and counting..._ - [Make ActionMailer Synchronous In Test](rails/make-action-mailer-synchronous-in-test.md) - [Manually Run A Migration From Rails Console](rails/manually-run-a-migration-from-rails-console.md) - [Mark For Destruction](rails/mark-for-destruction.md) +- [Mask An ActiveRecord Attribute](rails/mask-an-activerecord-attribute.md) - [Merge A Scope Into An ActiveRecord Query](rails/merge-a-scope-into-an-activerecord-query.md) - [Migrating Up Down Up](rails/migrating-up-down-up.md) - [Order Matters For `rescue_from` Blocks](rails/order-matters-for-rescue-from-blocks.md) diff --git a/rails/mask-an-activerecord-attribute.md b/rails/mask-an-activerecord-attribute.md new file mode 100644 index 0000000..2c7b566 --- /dev/null +++ b/rails/mask-an-activerecord-attribute.md @@ -0,0 +1,39 @@ +# 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.