DAZ wrote:
> I have a family-tree structure to a person model.
> 
> I want to be able to find people by specifying an array that
> corresponds to the family tree. So if Abe is grandpa, homer is dad and
> bart is the son, bart's array would be 
> 
> To find bart, I can't just use find_by_name("bart") as there might be
> another person called bart (with differnt parents and therefore a
> different array). So, to find this particular bart, I want to find abe
> first, then find homer, then bart.
> 
> How can I do an ititial database query of find_by_name("abe") that
> will find the "abe" record as well as all his descendant records, so
> that any subsequent filtering is efficient and doesn't hit the
> database?

Efficient retrieval of all descendants or all ancestors
of a record requires the addition of nested-set capability.

One alternative is to make the ancestor array a string key
to each record ("abe|homer|bart"), allowing instant retrieval.

Another would be to build the sql iteratively:

ancestors = %w(abe homer bart).reverse
conds = {"people.name" => ancestors.shift}
joins = nil
ancestors.each_with_index do |name, i|
   joins = joins.nil? ? :parent : {:parent => joins}
   conds.update("#parents_people#{'_' + (i+1).to_s if i!=0}.name" => name)
end

bart = Person.find(:first, :conditions => conds, :joins => joins)

-- 
Rails Wheels - Find Plugins, List & Sell Plugins - http://railswheels.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 rubyonrails-talk@googlegroups.com
To unsubscribe from this group, send email to 
rubyonrails-talk+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to