Newbie - Grouping of items

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

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!

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
[email protected]
http://lists.rubyonrails.org/mailman/listinfo/rails

_Kevin

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

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

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