Forum: Ruby on Rails find_by_sql() goes in model or controller?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
56eb877c42e47774db729bcfb8cad46f?d=identicon&s=25 sbeam (Guest)
on 2007-04-28 17:55
(Received via mailing list)
What is the canonical way to do a simple GROUP BY using AR? I have a
column, I'd like to just get the total for a certain user into the
view. So I can do find_by_sql() and then get the first element of the
collection in the controller, that's fine.

But it seems like the SQL stuff (assuming there is no way to do it
with just find() ) should go in the model. Since the model is in
charge of DB stuff, right? So is what is The Correct Way (tm) to do
it?

thanks
sam
6d57db44c5a4e0721cc7f78cf0ce308a?d=identicon&s=25 Stephen Bartholomew (steveb)
on 2007-04-28 18:06
(Received via mailing list)
I'd defiantly say the model.  The best way to think about it is 'could
I need this outside of a controller?'  - most 'business logic' like
this could be used elsewhere in the application.  Pretty much anything
that isn't dealing directly with something going from or to the view
should probably be in the model.

It's also better from a design point of view.  A 'user.total' method
is far easy to test and re-use.

Steve
56eb877c42e47774db729bcfb8cad46f?d=identicon&s=25 sbeam (Guest)
on 2007-04-28 18:31
(Received via mailing list)
OK, that's what I thought. But it does contradict my AWDWR book it
seems. Even a normal find() with all kinds of :conditions and :joins
seems like it couples the controller to the DB too much for my taste

That said, do I just do something like:

class Entry < ActiveRecord::Base
   def total_by_day(thedate)
        find_by_sql ["SELECT SUM(duration) FROM entries WHERE
entry_date = ?", thedate.to_s]
   end
end

and then in the controller
@todays_total = Entry.total_by_day(currdate)

if so, why doesn't it work? ;)

I get "undefined method `total_by_day' for Entry:Class"

??
1de2e094b9d6cebf76a0925c853a19f8?d=identicon&s=25 unknown (Guest)
on 2007-04-28 20:07
(Received via mailing list)
You need to define it like:
class Entry < ActiveRecord::Base
 def self.total_by_day(thedate); ...; end
end

This way it becomes a class method.

Entry.total_by_day() is a method called on the class Entry not the
Instance Entry.new().total_by_day()

Hope that helps,
Jim
56eb877c42e47774db729bcfb8cad46f?d=identicon&s=25 sbeam (Guest)
on 2007-04-29 01:50
(Received via mailing list)
On Apr 28, 2:06 pm, jimcfis...@gmail.com wrote:
> Hope that helps,
> Jim

It surely did ;)

I was a little lost on why it did - but on page 34 of the pickaxe I
was enlightened

thanks a bunch
This topic is locked and can not be replied to.