# ActiveRecord attribute= overload

**URL:** <https://www.ruby-forum.com/t/activerecord-attribute-overload/63234>\
**Category:** Rails\
**Created:** [June 13, 2006, 1:05pm UTC](https://www.ruby-forum.com/t/activerecord-attribute-overload/63234 "2006-06-13T13:05:12Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![ryan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/a8b319/32.png) [@ryan](https://www.ruby-forum.com/u/ryan)\
**Post date:** [June 13, 2006, 1:05pm UTC](https://www.ruby-forum.com/t/activerecord-attribute-overload/63234/1 "2006-06-13T13:05:12Z")

</div>

I want to overload the = operator for one of the attributes in a model  
to run a filter on the input. However I can’t do this:

def attribute=(data)  
self.attribute = filter(data)  
end

because that creates an infinite recursive loop.

How do I get around this?

---

<div class="post-metadata">

**Author:** ![ryan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/a8b319/32.png) [@ryan](https://www.ruby-forum.com/u/ryan)\
**Post date:** [June 13, 2006, 1:09pm UTC](https://www.ruby-forum.com/t/activerecord-attribute-overload/63234/2 "2006-06-13T13:09:11Z")

</div>

this should work (did not check):

class Bla \< ActiveRecord:Base  
alias :old\_attribute :attribute

def attribute=(data)  
self.old\_attribute = filter(data)  
end

end

-------- Original-Nachricht --------  
Datum: Tue, 13 Jun 2006 13:05:12 +0200  
Von: ryan [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
An: removed\_email\_address@domain.invalid  
Betreff: [Rails] ActiveRecord attribute= overload

---

<div class="post-metadata">

**Author:** ![ryan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/a8b319/32.png) [@ryan](https://www.ruby-forum.com/u/ryan)\
**Post date:** [June 13, 2006, 1:16pm UTC](https://www.ruby-forum.com/t/activerecord-attribute-overload/63234/3 "2006-06-13T13:16:00Z")

</div>

now I did check:

class Bla \< ActiveRecord:Base  
alias :old\_attribute= :attribute=

def attribute=(data)  
self.old\_attribute = filter(data)  
end

end

-------- Original-Nachricht --------  
Datum: Tue, 13 Jun 2006 13:08:06 +0200  
Von: Peter E. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
An: removed\_email\_address@domain.invalid  
Betreff: Re: [Rails] ActiveRecord attribute= overload

---

<div class="post-metadata">

**Author:** ![ryan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/a8b319/32.png) [@ryan](https://www.ruby-forum.com/u/ryan)\
**Post date:** [June 13, 2006, 1:25pm UTC](https://www.ruby-forum.com/t/activerecord-attribute-overload/63234/4 "2006-06-13T13:25:03Z")

</div>

Now I get.

NameError (undefined method `attribute=' for class `Bla’):

I know that I have a field called ‘attribute’ in the correct table.  
Shouldn’t there be a method called attribute= to overload?

Peter E. wrote:

> now I did check:
> 
> class Bla \< ActiveRecord:Base  
> alias :old\_attribute= :attribute=
> 
> def attribute=(data)  
> self.old\_attribute = filter(data)  
> end
> 
> end
> 
> -------- Original-Nachricht --------  
> Datum: Tue, 13 Jun 2006 13:08:06 +0200  
> Von: Peter E. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> An: removed\_email\_address@domain.invalid  
> Betreff: Re: [Rails] ActiveRecord attribute= overload

---

<div class="post-metadata">

**Author:** ![ryan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/a8b319/32.png) [@ryan](https://www.ruby-forum.com/u/ryan)\
**Post date:** [June 13, 2006, 2:24pm UTC](https://www.ruby-forum.com/t/activerecord-attribute-overload/63234/5 "2006-06-13T14:24:10Z")

</div>

I expected ‘attribute’ to be a placeholder for some attribute from  
you…

like:

class Address \< ActiveRecord:Base  
alias :old\_name= :name=

def name=(value)  
self.old\_name = name.capitalize  
end  
end

-------- Original-Nachricht --------  
Datum: Tue, 13 Jun 2006 13:25:03 +0200  
Von: ryan [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
An: removed\_email\_address@domain.invalid  
Betreff: [Rails] Re: Re: ActiveRecord attribute= overload

---

<div class="post-metadata">

**Author:** ![ryan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/a8b319/32.png) [@ryan](https://www.ruby-forum.com/u/ryan)\
**Post date:** [June 13, 2006, 4:11pm UTC](https://www.ruby-forum.com/t/activerecord-attribute-overload/63234/6 "2006-06-13T16:11:49Z")

</div>

Sorry I wasn’t clear. I guess I didn’t understand how ActiveRecord  
handled the attributes.

The example from Sam works well.

Peter E. wrote:

> I expected ‘attribute’ to be a placeholder for some attribute from  
> you…
> 
> like:
> 
> class Address \< ActiveRecord:Base  
> alias :old\_name= :name=
> 
> def name=(value)  
> self.old\_name = name.capitalize  
> end  
> end
> 
> -------- Original-Nachricht --------  
> Datum: Tue, 13 Jun 2006 13:25:03 +0200  
> Von: ryan [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> An: removed\_email\_address@domain.invalid  
> Betreff: [Rails] Re: Re: ActiveRecord attribute= overload

---

<div class="post-metadata">

**Author:** ![ryan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/a8b319/32.png) [@ryan](https://www.ruby-forum.com/u/ryan)\
**Post date:** [June 13, 2006, 1:25pm UTC](https://www.ruby-forum.com/t/activerecord-attribute-overload/63234/7 "2006-06-13T13:25:19Z")

</div>

def attribute=(data)  
write\_attribute(:attribute, filter(data))  
end

-Sam

---

<div class="post-metadata">

**Author:** ![ryan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/a8b319/32.png) [@ryan](https://www.ruby-forum.com/u/ryan)\
**Post date:** [June 13, 2006, 6:48pm UTC](https://www.ruby-forum.com/t/activerecord-attribute-overload/63234/8 "2006-06-13T18:48:53Z")

</div>

ryan wrote:

> Sorry I wasn’t clear. I guess I didn’t understand how ActiveRecord  
> handled the attributes.
> 
> The example from Sam works well.
> 
> Peter E. wrote:
> 
> > I expected ‘attribute’ to be a placeholder for some attribute from  
> > you…
> > 
> > like:
> > 
> > class Address \< ActiveRecord:Base  
> > alias :old\_name= :name=
> > 
> > def name=(value)  
> > self.old\_name = name.capitalize  
> > end  
> > end

I believe you can also use brackets

def foo=(value)  
value = perform\_some\_filter(value)  
self[:foo] = value  
end
