MVC, best practice for hash that combines objects?

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

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 [email protected]

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)

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. [email protected]

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

2009/5/13 Robert W. [email protected]

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.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs