O Active Record suporta três tipos de relacionamentos entre tabelas: de um para um, um para muitos e de muitos para muitos. Você indica esses relacionamentos ao adicionar declarações aos seus modelos: has_one, has_many, belongs_to e o chamado has_add_belongs_to_many.
Relacionamento de um para um
Uma associação de um para um (ou, mais exatamente, um relacionamento de um para zero e de zero para um) é implementado com uma chave estrangeira em uma linha de uma tabela para referenciar pelo menos uma única linha em outra tabela. Um relacionamento de um para um poderia existir entre pedidos e faturas: para cada pedido há pelo menos uma fatura.

Relacionamento de um para um
1
2
3
4
| class Invoice < ActiveRecord::Base
belongs_to :order
#...
end |
1
2
3
4
| class Order < ActiveRecord::Base
has_one :invoice
#...
end |
Como o exemplo mostra, declaramos isso no Rails, adicionando uma declaração has_one ao modelo Order e acrescentando uma declaração belongs_to ao modelo Invoice.
Há uma regra importante ilustrada aqui: o modelo para a tabela que contém a chave estrangeira sempre tem a declaração belongs_to.
Relacionamento de um para muitos
Uma associação de um para muitos permite representar uma coleção de objetos. Por exemplo, um pedido poderia conter um número qualquer de itens de linha associados. No banco de dados, todas as linhas da tabela do item de linha para um pedido particular contêm uma coluna de chave estrangeira que referencia esse pedido.

Relacionamento de um para muitos
1
2
3
4
| class LineItem < ActiveRecord::Base
belongs_to :order
#...
end |
1
2
3
4
| class Order < ActiveRecord::Base
has_many :line_items
#...
end |
No Active Record, o objeto pai (o que contém logicamente uma coleção de objetos filhos) utiliza has_many para declarar seu relacionamento com a tabela filha, e esta utiliza belongs_to para indicar seu pai. No nosso exemplo, a classe LineItem belongs_to :order e a tabela orders has_many :line_items.
Observe mais uma vez que, como o item de linha contém a chave estrangeira, ele tem a declaração belongs_to.
Relacionamento de muitos para muitos
Por fim, poderíamos categorizar nossos produtos. Um produto pode pertencer a muitas categorias e cada categoria pode conter múltiplos produtos. Esse é um exemplo de um relacionamento de muitos para muitos. É como se cada lado do relacionamento contivesse uma coleção de itens no outro lado.

Relacionamento de muitos para muitos
1
2
3
4
| class Category < ActiveRecord::Base
has_and_belongs_to_many :products
#...
end |
1
2
3
4
| class Produt < ActiveRecord::Base
has_and_belongs_to_many :categories
#...
end |
No Rails expressamos isso adicionando a declaração has_and_belongs_to_many aos dois modelos. De agora em diante, só utilizarei a forma abreviada, habtm, dessa declaração.
Associações de muitos para muitos são simétricas – as duas tabelas unidas declaram a associação entre uma e a outra utilizando habtm.
Dentro do banco de dados, associações de muitos para muitos são implementadas com a utilização de uma tabela de junção intermediária. Essa tabela contém pares de chave estrangeira que vinculam as duas tabelas alvo. O Active Record supõe que o nome dessa tabela de junção seja a concatenação dos dois nomes da tabela alvo em ordem alfabética. No nosso exemplo, associamos a tabela categories à tabela products e o Active Record irá procurar uma tabela de junção chamada categories_products.
Fonte: Thomas, Dave; Hansson, David Heinemeier. Desenvolvimento Web Ágil com Rails.
Se você gostou desse texto e acha que ajudou você, me recomende:
.