MVC, best practice for hash that combines objects?


#1

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


#2

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


#3

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)


#4

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


#5

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.