# Calculate methods on attr\_accessor objects

**URL:** <https://www.ruby-forum.com/t/calculate-methods-on-attr-accessor-objects/100191>\
**Category:** Rails\
**Created:** [July 27, 2006, 6:05pm UTC](https://www.ruby-forum.com/t/calculate-methods-on-attr-accessor-objects/100191 "2006-07-27T18:05:02Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![zerohalo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/5fc32e/32.png) [@zerohalo](https://www.ruby-forum.com/u/zerohalo)\
**Post date:** [July 27, 2006, 6:05pm UTC](https://www.ruby-forum.com/t/calculate-methods-on-attr-accessor-objects/100191/1 "2006-07-27T18:05:02Z")

</div>

Is it possible to use the calculate methods (sum, etc.) on attr\_accessor  
attributes?

Ie:

Class Item \< ActiveRecord::Base  
attr\_accessor :total\_cost

def total\_cost  
@total\_cost = self.cost\_unit \* self.amount  
end

calling Item.sum(:total\_cost) or Item.sum(‘total\_cost’) both return a  
unknown column ‘total\_cost’ mysql error.

I thought that active record considers attr\_accessor objects the same as  
columns in the table and all methods available to the model class would  
be  
available to the attr\_accessor too. Is that not so?

---

<div class="post-metadata">

**Author:** ![zerohalo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/5fc32e/32.png) [@zerohalo](https://www.ruby-forum.com/u/zerohalo)\
**Post date:** [July 27, 2006, 6:55pm UTC](https://www.ruby-forum.com/t/calculate-methods-on-attr-accessor-objects/100191/2 "2006-07-27T18:55:47Z")

</div>

On Thursday, July 27, 2006, at 11:02 AM, zer0halo wrote:

> end  
> “Impossible is nothing.”
> 
> * * *
> 
> Rails mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.rubyonrails.org/mailman/listinfo/rails](http://lists.rubyonrails.org/mailman/listinfo/rails)

IIRC the AR Calculations feature actually lets the DB do the  
calculation, so it needs to understand how to do the calculation before  
it will work.

Something like this may work…

Item.sum(:select=\>‘(cost\_unit + amount)’)

Not tested, so YMMV.

\_Kevin  
[www.sciwerks.com](http://www.sciwerks.com)

---

<div class="post-metadata">

**Author:** ![zerohalo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/5fc32e/32.png) [@zerohalo](https://www.ruby-forum.com/u/zerohalo)\
**Post date:** [July 27, 2006, 9:30pm UTC](https://www.ruby-forum.com/t/calculate-methods-on-attr-accessor-objects/100191/3 "2006-07-27T21:30:36Z")

</div>

Thanks, Kevin. That didn’t work, but it got me going in the right  
direction.

Through a bit of trial and error I discovered that contrary to what the  
AR rdoc says, count\_by\_sql accepts other methods than just COUNT.

So this works:

Item.count\_by\_sql(“select sum(cost\_unit \* amount) from items”)

Not very “rails like” though :-(. I should probably write a  
calculate\_by\_sql helper that accepts all the various calculate commands  
for those instances where you need more than just the sum of a single  
column or where that column doesn’t exist.

Kevin O. wrote:

> Something like this may work…
> 
> Item.sum(:select=\>’(cost\_unit + amount)’)

---

<div class="post-metadata">

**Author:** ![zerohalo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/5fc32e/32.png) [@zerohalo](https://www.ruby-forum.com/u/zerohalo)\
**Post date:** [July 27, 2006, 9:35pm UTC](https://www.ruby-forum.com/t/calculate-methods-on-attr-accessor-objects/100191/4 "2006-07-27T21:35:44Z")

</div>

> Item.count\_by\_sql(“select sum(cost\_unit \* amount) from items”)

Item.sum ‘cost\_unit \* amount’

---

<div class="post-metadata">

**Author:** ![zerohalo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/5fc32e/32.png) [@zerohalo](https://www.ruby-forum.com/u/zerohalo)\
**Post date:** [July 27, 2006, 9:41pm UTC](https://www.ruby-forum.com/t/calculate-methods-on-attr-accessor-objects/100191/5 "2006-07-27T21:41:32Z")

</div>

Ah of course, I figured there was a simple Rails way but hadn’t found  
it. Why didn’t I try that? 🙂

The kind of thing that would be handy to add to the documentation.

By the way, there used to be annotated documentation at  
[rails.outertrack.com](http://rails.outertrack.com) but it’s down these days. Has it moved elsewhere? I  
could add a comment on this to it.

Rick O. wrote:

> > Item.count\_by\_sql(“select sum(cost\_unit \* amount) from items”)
> 
> Item.sum ‘cost\_unit \* amount’

---

<div class="post-metadata">

**Author:** ![zerohalo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/5fc32e/32.png) [@zerohalo](https://www.ruby-forum.com/u/zerohalo)\
**Post date:** [July 27, 2006, 10:10pm UTC](https://www.ruby-forum.com/t/calculate-methods-on-attr-accessor-objects/100191/6 "2006-07-27T22:10:56Z")

</div>

On Thursday, July 27, 2006, at 9:41 PM, FranÃ§ois Montel  
wrote:

> > > Item.count\_by\_sql(“select sum(cost\_unit \* amount) from items”)
> > 
> > Item.sum ‘cost\_unit \* amount’
> 
> –  
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).
> 
> * * *
> 
> Rails mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.rubyonrails.org/mailman/listinfo/rails](http://lists.rubyonrails.org/mailman/listinfo/rails)

[http://railsmanual.org](http://railsmanual.org)

\_Kevin  
[www.sciwerks.com](http://www.sciwerks.com)
