# Activerecord: use attributes methods instead of attrs var

**URL:** <https://www.ruby-forum.com/t/activerecord-use-attributes-methods-instead-of-attrs-var/149255>\
**Category:** Rails\
**Created:** [September 23, 2008, 12:05am UTC](https://www.ruby-forum.com/t/activerecord-use-attributes-methods-instead-of-attrs-var/149255 "2008-09-23T00:05:25Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![leonb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/22d042/32.png) [@leonb](https://www.ruby-forum.com/u/leonb)\
**Post date:** [September 23, 2008, 12:05am UTC](https://www.ruby-forum.com/t/activerecord-use-attributes-methods-instead-of-attrs-var/149255/1 "2008-09-23T00:05:25Z")

</div>

This is the case: when you call save() on an activerecord::base object  
it goes through all the attrs[:] and saves them. But I have a lot of  
attributes overriden.  
For example:

class Tester  
def name  
write\_attribute(:name, ‘This is just a silly example!’)  
read\_attribute(:name)  
end  
end

t = Tester.new  
t.save

But when I do save() it doesn’t get saved to the database if I haven’t  
called the name() method.

When I add a validation, the method somewhere gets called and it is  
added to the attrs instance variable.

Is there a way, without adding validations for every attribute, to call  
the attribute methods before save?

I thought about using a before\_save filter, but maybe someone would new  
a better/other way.

I’m just curious if it’s possible. Maybe I’m on the wrong track and  
there may be better ways to override the attribute getters?

Thanks in advance!

---

<div class="post-metadata">

**Author:** ![leonb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/22d042/32.png) [@leonb](https://www.ruby-forum.com/u/leonb)\
**Post date:** [September 23, 2008, 2:11am UTC](https://www.ruby-forum.com/t/activerecord-use-attributes-methods-instead-of-attrs-var/149255/2 "2008-09-23T02:11:10Z")

</div>

On Mon, Sep 22, 2008 at 6:05 PM, Leon B. \<  
removed\_email\_address@domain.invalid\> wrote:

> end
> 
> Is there a way, without adding validations for every attribute, to call  
> the attribute methods before save?
> 
> I thought about using a before\_save filter, but maybe someone would new  
> a better/other way.
> 
> I’m just curious if it’s possible. Maybe I’m on the wrong track and  
> there may be better ways to override the attribute getters?

You’re essentially trying to set default values for your attributes,  
right?  
If so, I would use the #after\_initialize callback, which AR calls when a  
new  
instance of the class is created.

class Tester \< ActiveRecord::Base  
def after\_initialize  
self.name ||= ‘Default name’  
end  
end

## Brandon

* * *

Sessions by Collective Idea: Ruby on Rails training in a vacation  
setting  
[http://sessions.collectiveidea.com](http://sessions.collectiveidea.com)

---

<div class="post-metadata">

**Author:** ![leonb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/22d042/32.png) [@leonb](https://www.ruby-forum.com/u/leonb)\
**Post date:** [September 23, 2008, 4:15am UTC](https://www.ruby-forum.com/t/activerecord-use-attributes-methods-instead-of-attrs-var/149255/3 "2008-09-23T04:15:09Z")

</div>

I would recommend the before\_create callback.  
it seems you do not need to overwrite the the attributes everytime you  
update it,  
and before\_create work only for new records.

after\_initialize has performance issue  
and overwrite the default getter may cause side effects.

hope that helps.

Regards,

Peng Zuo

On Tue, Sep 23, 2008 at 8:10 AM, Brandon K. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> > write\_attribute(:name, ‘This is just a silly example!’)  
> > When I add a validation, the method somewhere gets called and it is
> 
> ## Brandon
> 
> * * *
> 
> Sessions by Collective Idea: Ruby on Rails training in a vacation setting  
> [http://sessions.collectiveidea.com](http://sessions.collectiveidea.com)
> 
> >

–

Murray Walker - “And now, excuse me while I interrupt myself.”
