Forum: Ruby on Rails MVC, best practice for hash that combines objects?

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.
arcX (Guest)
on 2009-05-13 22:07
(Received via mailing list)
Hi,

I just wanted to see if I am on the right track, as I am new to MVC.

I have a model called Tasks, and another called Entries. Tasks has
many entries.

Each entry has a time. So I want to total up the time entries so that
I have a keyed array of task Ids => duration.

In the end, I want to then print it out as a table in the reports
view, doing things like filter by completed, by date, etc.

Where should this hash be constructed? A function in a Report model?

Thanks!
arcX
Colin L. (Guest)
on 2009-05-14 00:33
(Received via mailing list)
Assuming you are developing in Rails then the convention would be for
the
models to be Task and Entry, with the controllers tasks_controller and
entries_controller.

If I have understood the problem correctly I think the first thing I
would
do is provide a method in model Task called duration that returns the
total
duration for that task by summing task.entries.time.  Then all you need
to
pass to the report view is @tasks containing the tasks you are
interested in
and for each one task.duration is available to be displayed as desired.

Colin

2009/5/13 arcX <removed_email_address@domain.invalid>
Robert W. (Guest)
on 2009-05-14 01:17
Colin L. wrote:
> If I have understood the problem correctly I think the first thing I
> would
> do is provide a method in model Task called duration that returns the
> total
> duration for that task by summing task.entries.time.  Then all you need
> to
> pass to the report view is @tasks containing the tasks you are
> interested in
> and for each one task.duration is available to be displayed as desired.

Rails also provides aggregate functions so rather than writing a
duration method you could also write:
task = Task.find(:first)
task.entries.sum(:time)

Line 2 generates the following SQL:
SELECT sum("entries".time) AS sum_time FROM "entries" WHERE
("entries".task_id = 1)
Colin L. (Guest)
on 2009-05-14 11:07
(Received via mailing list)
2009/5/13 Robert W. <removed_email_address@domain.invalid>

> > and for each one task.duration is available to be displayed as desired.
>
> Rails also provides aggregate functions so rather than writing a
> duration method you could also write:
> task = Task.find(:first)
> task.entries.sum(:time)


I would still suggest having a duration method, where the method just
returns entries.sum(:time), as it removes the requirement that the
caller
needs to know that how to work out the duration.
Alex Scott (Guest)
on 2009-05-14 15:28
(Received via mailing list)
Wow!Thanks so much to both of you, that works great for me!
It also helped me to understand just how powerful the model can be.
arcX


2009/5/14 Colin L. <removed_email_address@domain.invalid>

>> > pass to the report view is @tasks containing the tasks you are
> returns entries.sum(:time), as it removes the requirement that the caller
>>
>>
>>
>
> >
>


--
Aim:
arcxweb

Skype:
alexscott1
This topic is locked and can not be replied to.