1
0
mirror of https://github.com/jbranchaud/til synced 2026-01-02 22:58:01 +00:00

Add Get ActiveRecord Attribute Directly From Database as a Rails til

This commit is contained in:
jbranchaud
2022-03-28 10:44:12 -05:00
parent dc8f1a52c9
commit 53931955d2
2 changed files with 38 additions and 1 deletions

View File

@@ -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..._
---
@@ -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)

View File

@@ -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)