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

Colin Law 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 Law 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)

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.

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