Newbie - Grouping of items


#1

I’m trying to build a dashboard type page (similar in function to
basecamp’s) where I can show the last 5 updated items from my 3
differing models, then grouped together by project.

Solution ideas:
(1) Is it best to create a log model where everytime I add or update
another model (like messages, comments, lists etc) an enrty gets added
to the log along with the project. I can see this being an overkill and
the duplication of data is not correct.

(2) In my controller perform a query that searches every model for every
item against a given project_id. The order the results by “updated_on”.
Then select the last 5 for each result. This seems really complicated
and perfoms many SQL queries

Does rails/ruby have a better way of achieving this? What have you done
in your projects that works reliably and quickly?

Many thanks


#2

this is how I would do it:

  • add a new array for your Project model, it would be called
    “last_updates”.

THEN

  • create an observer that append the updates to the last_updates array
    every time there is an update.

OR

-overwrite the ‘after_save’ (dont remember the exact name of the
callback) callback from each model that you want to track to add the
change to the last_updates array.

finaly, your model should have a method that returns the last X updates
as an array to the view.

It would also be a good idea to restrict the size of the array. Or
replace the array with a new DB table to log all the updates…

Anyways, I am new ot RoR so I cant wait to see what others are going to
say!


#3

I think your second approach is best.
It should only require one find for each model, which probably isn’t
that bad.

Object.find_by_project(project_id, :order=>‘updated_on DESC’, :limit=>5)
or more likely…

user.items(:order=>‘updated_on DESC’, :conditions=>“updated_on >
#{Time.now-24.hours}”)

if you have a user has_many :items, :through=>:projects

this will give you the most flexibility.

If you create a ‘log’ object, you could use a polymorphic association to
make it efficient, but you would either have to duplicate information in
the log table (project_id, etc) or you would only be able to sort it by
time

disclaimer - code not tested

On Tuesday, April 25, 2006, at 11:21 AM, James W. wrote:

(2) In my controller perform a query that searches every model for every
Posted via http://www.ruby-forum.com/.


Rails mailing list
removed_email_address@domain.invalid
http://lists.rubyonrails.org/mailman/listinfo/rails

_Kevin


#4

Kevin O. wrote:

I think your second approach is best.
It should only require one find for each model, which probably isn’t
that bad.

Object.find_by_project(project_id, :order=>‘updated_on DESC’, :limit=>5)
or more likely…

user.items(:order=>‘updated_on DESC’, :conditions=>“updated_on >
#{Time.now-24.hours}”)

if you have a user has_many :items, :through=>:projects

this will give you the most flexibility.

If you create a ‘log’ object, you could use a polymorphic association to
make it efficient, but you would either have to duplicate information in
the log table (project_id, etc) or you would only be able to sort it by
time

disclaimer - code not tested

On Tuesday, April 25, 2006, at 11:21 AM, James W. wrote:

(2) In my controller perform a query that searches every model for every
Posted via http://www.ruby-forum.com/.


Rails mailing list
removed_email_address@domain.invalid
http://lists.rubyonrails.org/mailman/listinfo/rails

_Kevin

Thanks all, I have not looked at the through=> yet sounds promising. I
have a slight issue with case statements in my view (for my menu items)
(only on osx see other post) at the moment so I will test soon. Thanks
for your help.


#5

James W. wrote:

Kevin O. wrote:

I think your second approach is best.
It should only require one find for each model, which probably isn’t
that bad.

Object.find_by_project(project_id, :order=>‘updated_on DESC’, :limit=>5)
or more likely…

user.items(:order=>‘updated_on DESC’, :conditions=>“updated_on >
#{Time.now-24.hours}”)

if you have a user has_many :items, :through=>:projects

this will give you the most flexibility.

If you create a ‘log’ object, you could use a polymorphic association to
make it efficient, but you would either have to duplicate information in
the log table (project_id, etc) or you would only be able to sort it by
time

disclaimer - code not tested

On Tuesday, April 25, 2006, at 11:21 AM, James W. wrote:

(2) In my controller perform a query that searches every model for every
Posted via http://www.ruby-forum.com/.


Rails mailing list
removed_email_address@domain.invalid
http://lists.rubyonrails.org/mailman/listinfo/rails

_Kevin

Thanks all, I have not looked at the through=> yet sounds promising. I
have a slight issue with case statements in my view (for my menu items)
(only on osx see other post) at the moment so I will test soon. Thanks
for your help.

Sorry to bring this back to the front, but I still have major problems
getting this to work. What I am trying to get is like this:

Project 1
todo item 12 - 03/05/06 12:33
message 22 - 03/05/06 12:21
message 66 - 03/05/06 10:55
todo item 18 - 02/05/06 09:33
milestone 2 - 02/05/06 09:20
todo item 4 - 01/05/06 09:20

Project 2
message 31 - 03/05/06 12:15
todo item 13 - 02/05/06 11:48
milestone 28 - 02/05/06 09:20

Project 3

I a client has many projects. A project has many messages, tickets,
todo_lists, milestones. A todo_list has many todo_list_items.

I am trying to get a homepage that will group the latest updated items
(that could be a milestone, message or todo_list item) by project
ordered by date.

I have looked at the group_by Rails 1.1 but that does not achieve what I
need like above. I can’t think how to best do this can anyone else give
me an idea?