Forum: Ruby on Rails Can A Model Have Many belongs_to?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Don S. (Guest)
on 2006-01-13 00:04
I am very new to Rails.  After skimming through the documentation over
the last several days, I'm struggling with the appropriate use of
belongs_to.  My main question is whether a model can have several
belongs_to declarations.  I have not seen any examples online show that
usage.  If it can, then I would like to know if it's poor form or what
the best practices are around it.  The documentation says that the
foreign key should be in the table that belongs_to the linked table so
that the linked table data is available via the object model. (i.e. if
system belongs_to address then you would have a foreign key
system.address_id so that you can do system.address.state or
system.address.zip, etc.

But if I have data in several other tables that I wish to access this
way, it would require several belongs_to declarations in the same model.

For my circumstances I have a system (represents a computer) table that
is linked to several other small tables.  I want all the data in these
other tables to be available from the system object.

I have this:

class System < ActiveRecord::Base
	belongs_to :department
	belongs_to :address
	belongs_to :operatingsystem
	has_many :oldnames
end

class Department < ActiveRecord::Base
	has_many :systems
	has_many :people
end

class Address < ActiveRecord::Base
	has_many :systems
	has_many :people
end

class Oldname < ActiveRecord::Base
	belongs_to :system
end

class Operatingsystem < ActiveRecord::Base
	has_many :systems
end

class Person < ActiveRecord::Base
	belongs_to :department
	belongs_to :address
end

You'll also notice that Person belongs_to Address and Department the
same way System does.  Is this allowable?  I have done this because I
have several thousand systems and several thousand people but only 25
addresses (locations).  Same thing with Operatingsystems, I have several
thousand systems but only 8 or nine operating systems.

Any peer review the community can provide would be much appreciated.

One last question; I have a table of old hostnames (Oldnames).  Oldname
belongs to System and System has_many Oldnames.  Since system doesn't
belong_to oldnames ,what's the easiest way to fetch a System's
collection of Oldnames?

Thanks for the help!

 - Don
Marc L. (Guest)
on 2006-01-13 00:24
Don S. wrote:
> My main question is whether a model can have several
> belongs_to declarations.  I have not seen any examples online show that
> usage.  If it can, then I would like to know if it's poor form or what
> the best practices are around it.  The documentation says that the
> foreign key should be in the table that belongs_to the linked table so
> that the linked table data is available via the object model. (i.e. if
> system belongs_to address then you would have a foreign key
> system.address_id so that you can do system.address.state or
> system.address.zip, etc.
>
> But if I have data in several other tables that I wish to access this
> way, it would require several belongs_to declarations in the same model.

There's nothing wrong with having several belongs_to declarations in the
same model.  Your model declarations look fine to me.  Since each
association has a different foreign key (i.e. department_id,
address_id), there's no conflict concerns.  Person.department ....
Person.address, these will both work fine.

> You'll also notice that Person belongs_to Address and Department the
> same way System does.  Is this allowable?

Yep, again no problem.

> One last question; I have a table of old hostnames (Oldnames).  Oldname
> belongs to System and System has_many Oldnames.  Since system doesn't
> belong_to oldnames ,what's the easiest way to fetch a System's
> collection of Oldnames?

You'd fetch a system's collection fo Oldnames by doing
"System.oldnames".  Along with that you can do any of the has_many
functions listed towards the bottom of the documentation of the has_many
method.  System.oldnames.find(), System.oldnames.empty?,
System.oldnames.delete, etc.

Looks to me like you're on the right track.
Don S. (Guest)
on 2006-01-13 03:19
Sweet!  Thanks a bunch.  I think I'm in love with RoR.  I can't wait to
show my ColdFusion pals.

Thanks again for the help!

 - Don
This topic is locked and can not be replied to.