The difference between
has_one is a semantic one. The model that declares
belongs_to includes a column containing the foreign key of the other. The model that declares
has_one has its foreign key referenced.
class Orders < ActiveRecord::Base # I reference a customer. belongs_to :customer end
class Supplier < ActiveRecord::Base
# One account references me.
![Illustration of a hasone relationship](http://guides.rubyonrails.org/images/has_one.png)
If you're finding it difficult to recall which is which (they're saying the same thing, right?), remember that you know who your heart belongs to, but if you have one secret admirer, only they know about the relationship. Creepy.
Suppliers have one account, and accounts have one account history. By the transitive property, suppliers have one account history.
Following the same
has-styled relationship of
has_one :through, the class that declares
has_many is referenced by many objects that
has_many fans, who
belong_to him. They keep his foreign key (aka poster on the wall), and he doesn't know they exist.
class Customer < ActiveRecord::Base has_many :orders end
has_many :through can be used to establish shortcuts through nested relationships, as with a document that has many paragraphs, which have many sections. A document also has many paragraphs because it has many sections.
class Document < ActiveRecord::Base has_many :sections has_many :paragraphs :through => :sections end class Section < ActiveRecord::Base belongs_to :document has_many :paragraphs end class Paragraph < ActiveRecord::Base belongs_to :section end
Via this nested association,
has_many :through, Rails can now make sense of the statement:
has_many :through is also useful for describing
has_and_belongs_to_many "by association" relationships. The Rails documentation provides the example of patients and doctors that each have many appointments and likewise have many of one another (patients or doctors) via appointments, although this example could also be appropriately described by a
Now Rails recognizes:
has_and_belongs_to_many relationship is common of networks--both real and digital. Doctors have many patients and those patients may have many doctors. Facebook accounts have many friends and belong to many friends lists.