Skip to content

Commit

Permalink
Add Get ActiveRecord Attribute Directly From Database as a Rails til
Browse files Browse the repository at this point in the history
  • Loading branch information
jbranchaud committed Mar 28, 2022
1 parent dc8f1a5 commit 5393195
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ pairing with smart people at Hashrocket.

For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186).

_1189 TILs and counting..._
_1190 TILs and counting..._

---

Expand Down Expand Up @@ -722,6 +722,7 @@ _1189 TILs and counting..._
- [Find Records With Multiple Associated Records](rails/find-records-with-multiple-associated-records.md)
- [Force All Users To Sign Out](rails/force-all-users-to-sign-out.md)
- [Generating And Executing SQL](rails/generating-and-executing-sql.md)
- [Get ActiveRecord Attribute Directly From Database](rails/get-active-record-attribute-directly-from-database.md)
- [Get An Array Of Values From The Database](rails/get-an-array-of-values-from-the-database.md)
- [Get An Empty ActiveRecord Relation](rails/get-an-empty-activerecord-relation.md)
- [Get The Column Names For A Model](rails/get-the-column-names-for-a-model.md)
Expand Down
36 changes: 36 additions & 0 deletions rails/get-active-record-attribute-directly-from-database.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Get ActiveRecord Attribute Directly From Database

In Rails, an ActiveRecord model will automatically get methods named after each
column in the backing database table. This can be called to retrieve those
values from the respective columns in the database.

What if you wanted to override and alter one of those values? For example,
ensure the `email` value you're passing around is always fully downcased.

Something like this won't quite work.

```ruby
def email
email.downcase
end
```

Because the method is named `email`, the `email` reference inside it will call
itself, recursively, until it exceeds the stack.

Instead, you need a way of referencing the email attribute that is stored in
the database.
[`attribute_in_database`](https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Dirty.html#method-i-attribute_in_database)
will do the trick.

```ruby
def email
attribute_in_database('email').downcase
end
```

That will retrieve the value from the `email` column in the database for this
record, downcase it, and return it. Anyone calling `email` won't notice the
difference.

h/t [Dillon Hafer](https://twitter.com/dillonhafer)

0 comments on commit 5393195

Please sign in to comment.