Во-первых, я бы пересмотрел синтаксис в соответствии с соглашением:
class Foo < ActiveRecord::Base
has_many :foo_bars
has_many :foo_bar_bazs, :through => :foo_bars
end
class FooBar < ActiveRecord::Base
has_many :foo_bar_bazs
belongs_to :foo_bar
end
Class FooBarBaz < ActiveRecord::Base
belongs_to :pc_scene_item
end
Теперь, когда у нас есть объекты:
Foo.find(:all, :include => [:foo_bars, :foo_bar_bazs])
Теперь: можно избежать сквозного перехода, и выможно сделать:
foos = Foo.find(:all, :include => [{:foo_bars => [:foo_bar_bazs]}])
Чтобы получить всех детей:
children = foos.collect{|f| f.foo_bars}.flatten.uniq
Чтобы получить всех внуков:
grandchildren = foos.collect{|f| f.foo_bars.collect{|b| b.foo_bar_bazs}}.flatten.uniq