# NOOB question about DB relationship and using find!

**URL:** <https://www.ruby-forum.com/t/noob-question-about-db-relationship-and-using-find/78963>\
**Category:** Rails\
**Created:** [December 11, 2006, 12:49am UTC](https://www.ruby-forum.com/t/noob-question-about-db-relationship-and-using-find/78963 "2006-12-11T00:49:35Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![mixplate](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/a6a055/32.png) [@mixplate](https://www.ruby-forum.com/u/mixplate)\
**Post date:** [December 11, 2006, 12:49am UTC](https://www.ruby-forum.com/t/noob-question-about-db-relationship-and-using-find/78963/1 "2006-12-11T00:49:35Z")

</div>

if class A has\_many class b. and class B has\_many class C.

when doing a find on class A, will my model have class c information?

like…

class maincategory

class subcategory  
maincategory\_id

class bottom.  
subcategory\_id

also, is it possible to get a model from the bottom class, and find out  
whats its main category is?

THANKS!

---

<div class="post-metadata">

**Author:** ![mixplate](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/a6a055/32.png) [@mixplate](https://www.ruby-forum.com/u/mixplate)\
**Post date:** [December 11, 2006, 2:04am UTC](https://www.ruby-forum.com/t/noob-question-about-db-relationship-and-using-find/78963/2 "2006-12-11T02:04:48Z")

</div>

Lets make it a little less abstract.

Class Country  
has\_many :states

Class State  
belongs\_to :country  
has\_many :cities

Class City  
belongs\_to :state

You can grab an array of related cities from the Country by doing:  
Country.find(id).state.cities

You can go backwards, too:  
City.find(id).state.country

Keep in mind the proper pluralization according to has\_many or  
belongs\_to. Did that answer your question?

---

<div class="post-metadata">

**Author:** ![mixplate](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/a6a055/32.png) [@mixplate](https://www.ruby-forum.com/u/mixplate)\
**Post date:** [December 11, 2006, 2:09am UTC](https://www.ruby-forum.com/t/noob-question-about-db-relationship-and-using-find/78963/3 "2006-12-11T02:09:30Z")

</div>

> You can grab an array of related cities from the Country by doing:  
> Country.find(id).state.cities

Slight mistake here. You need to identify the state because a country  
has\_many states. So the proper way would be:

Country.find(id).state[array\_index\_number].cities

You can only go from 1:1 or 1:M, never M:M. This is why you cannot do:

Country.find(id).states.cities

---

<div class="post-metadata">

**Author:** ![mixplate](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/a6a055/32.png) [@mixplate](https://www.ruby-forum.com/u/mixplate)\
**Post date:** [December 11, 2006, 5:29pm UTC](https://www.ruby-forum.com/t/noob-question-about-db-relationship-and-using-find/78963/4 "2006-12-11T17:29:01Z")

</div>

thank you taylor for the explanation!

---

<div class="post-metadata">

**Author:** ![mixplate](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/a6a055/32.png) [@mixplate](https://www.ruby-forum.com/u/mixplate)\
**Post date:** [December 11, 2006, 6:23pm UTC](https://www.ruby-forum.com/t/noob-question-about-db-relationship-and-using-find/78963/5 "2006-12-11T18:23:41Z")

</div>

ok, now that i tried it out, i got some more questions please.

to expand on this  
“Country.find(id).state[array\_index\_number].cities”

how can i return all the city names in a view for a country?

basically i will need a hash where in each position is the state name  
linked to an array of city names for that state?

is it possible to do the find in the cities table like

Cities.find(  
:all,  
:conditions =\> ‘city.state.country\_id =\> ?’,params[:selectedCountry]  
)

?

---

<div class="post-metadata">

**Author:** ![mixplate](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/a6a055/32.png) [@mixplate](https://www.ruby-forum.com/u/mixplate)\
**Post date:** [December 11, 2006, 6:41pm UTC](https://www.ruby-forum.com/t/noob-question-about-db-relationship-and-using-find/78963/6 "2006-12-11T18:41:18Z")

</div>

> I’ve never tried a reverse join like you suggest. Here is the ‘vanilla’ way of doing it:

The find method calls a Class, so it will be singular like: City.find,  
Country.find, etc.

@country = Country.find(id\_number, :include =\> {:states =\> :cities}}

will create a massive nested object with all states and cities properly  
organized. To see the hash add \<%= debug(@country) %\> to your view.  
But remember you cannot use ActiveRecord class methods on arrays so you  
will have to iterate like:

\<% for state in @country.states %\> #iterate through states one at a time  
\<% for city in state.cities %\> #iterate through each city one at a  
time  
\<%= city.name %\> #show each city object’s name  
\<% end %\>  
\<% end %\>

If you only had one layer of 1:M you could simply collect the find  
results into an array and then spit out a string, “Atlanta, Macon,  
Savannah”:

city\_names = State.find(id\_number).cities.collect {|c| c.name }.join(",  
")

ALL THIS CODE IS UNTESTED!

---

<div class="post-metadata">

**Author:** ![mixplate](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/a6a055/32.png) [@mixplate](https://www.ruby-forum.com/u/mixplate)\
**Post date:** [December 11, 2006, 6:52pm UTC](https://www.ruby-forum.com/t/noob-question-about-db-relationship-and-using-find/78963/7 "2006-12-11T18:52:32Z")

</div>

nice! thanks Taylor! works awesomely!  
@country = Country.find(id\_number, :include =\> {:states =\> :cities}}

Taylor S. wrote:

> > I’ve never tried a reverse join like you suggest. Here is the ‘vanilla’ way of doing it:
> 
> The find method calls a Class, so it will be singular like: City.find,  
> Country.find, etc.
> 
> @country = Country.find(id\_number, :include =\> {:states =\> :cities}}
> 
> will create a massive nested object with all states and cities properly  
> organized. To see the hash add \<%= debug(@country) %\> to your view.  
> But remember you cannot use ActiveRecord class methods on arrays so you  
> will have to iterate like:
> 
> \<% for state in @country.states %\> #iterate through states one at a time  
> \<% for city in state.cities %\> #iterate through each city one at a  
> time  
> \<%= city.name %\> #show each city object’s name  
> \<% end %\>  
> \<% end %\>
> 
> If you only had one layer of 1:M you could simply collect the find  
> results into an array and then spit out a string, “Atlanta, Macon,  
> Savannah”:
> 
> city\_names = State.find(id\_number).cities.collect {|c| c.name }.join(",  
> ")
> 
> ALL THIS CODE IS UNTESTED!
