DGerton wrote: > This is question deals with the common example where Category has_many > Products. (We'll use Species instead of Products here.) > > Assume Category is a nested class. Let's use this as the example: > > [Categories] > Animals (id 1, parent_id=nil) > -Mammals (id 2, parent_id=1) > --Rodents (id 3, parent_id=2) > -Birds (id 4, parent_id=1) > > [Species] > Dog (category_id 2) > Cat (category_id 2) > Mouse (category_id 3) > Rabbit (category_id 3) > Duck (category_id 4) > > I want to be able to perform a select at Animals and get all of the > Species below it, and also be able to select from Birds and just get > Duck. It's also necessary to sort the resultant collection. > > This seems like a common problem and I'm overlooking a simple > solution. Right now, though, I'm thinking I need to build up a query > with a lot of ORs in the WHERE clause (e.g. to get mammals and the > children I'd need :condition => "category_id = 2 OR category_id = > 3"). This doesn't feel very rails-like. > > I'm not opposed to restructuring the database at this point, if that > makes solving this problem easier.
You're using an adjacency-list tree model right now, where each node only stores its parent ID. This has the problem you've discovered: you can't get all descendants to arbitrary depths with one query. The solution is to use a nested-set or nested-interval model. There are several Rails plugins for this; awesome_nested_set is the one that I've used most. > > Thanks in advance. > Dave Best -- Marnen Laibow-Koser http://www.marnen.org [email protected] -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

