Traversing nested ActiveRecord associations

Let’s say…

class Town < ActiveRecord::Base
has_many :streets
has_many :houses, :through => :streets
end

class Street < ActiveRecord::Base
has_many :houses
end

Then we can find individual streets and houses like this…

@first_town = Town.find(:first)
@first_towns_first_street = @first_town.streets.first
@first_streets_first_house = @first_town_first_street.house.first

We can also find arrays of streets and houses like this…

@first_town_all_streets = @first_town.streets
@first_street_all_houses = @first_street.houses

But what is the correct syntax for the kind of array I’m trying to
generate here?

@first_town_all_houses = @first_town.streets.houses

I’m presuming I can create a methods that iterates through the streets
array, generates an array of houses for each street, and adds that
array to a larger array of my own creation. Likewise, I’m assuming I
can assign a town_id to each house whenever I create it, just as I
automatically assign it a street_id through create/build. However, I’m
hoping there’s an existing method that’ll just magic up the results.
Problem is, so far I haven’t found it on either of the following
pages:

http://corelib.rubyonrails.org/classes/Array.html

Thanks in advance,

Steven.

OK, I added a town_id to each house and it’s working fine, but if
there’s a method I’ve missed that handles this automagically, it’d be
great to know.

s.

Where is the belongs_to :town in the Street Model?

class Town < ActiveRecord::Base
has_many :streets
has_many :houses, :through => :streets
end

class Street < ActiveRecord::Base
belongs_to :town
has_many :houses
end

You can then do Town.first.houses just fine.