Relacionamento no Rails

Dicas sobre implementações de Relacionamentos no Rails  

Relacionamentos 1 x N: (pertence à) 

Relação  
Equipamentos.processador_id N <-> 1 Processadors.Id
Equipamentos.usuario_id N <-> 1 Usuarios.Id
Equipamentos.polegmonitor_id N <-> 1 PolegMonitors.Id
Equipamentos.so_id N <-> 1 SistOpers.Id
Equipamentos.office_id N <-> 1 Offices.Id
Equipamentos.local_id N <-> 1 Locals.Id

 1xN – Lado N (Equipamentos)

Alterar o

model

Incluir: “belongs_to lado1” (sem “s”) belongs_to :usuario
belongs_to :polegmonitor
belongs_to :processador
belongs_to :sistoper
belongs_to :o ffice
belongs_to :local
No model Deve ter chave estrangeira usuario_id
polegmonitor_id
processador_id
sistoper_id
office_id
local_id
Acertar os testes Completar as fixtures do lado 1 test/fixture/ladoN.ymlTrocar “usuario_id: 1” por “usuario: __aliasusuario_”
Alterar a view _form Incluir combos @ ado1 <p><label for=”usuario_equipamento”> Usuario</label> <%=f.select :usuário_id, @usuarios %></p>(fazer para todos)
Alterar o controller Incluir métodos load_lado1 def load_usuarios@usuarios = Usuario.find(:all, order => “nome_usuario”).map {|c| [c.nome_usuario, c.id]}end(fazer para todos)
Alterar o controller Incluir no início: “before_filter :load_lado1 before_filter :load_usuarios
before_filter :load_polegmonitors
before_filter :load_processadors
before_filter :load_sistopers
before_filter :load_offices
before_filter :load_locals
Alterar a view show Incluir no início <p><b>Usuario:</b> <%=link_to @equipamento.usuario.nome_usuario, @equipamento.usuario %></p>(fazer para todos)

   Relacionamentos NxN: (tem e pertence a vários) 

·  Relacionamento NxN NÃO polimórfico – a tabela associativa NÃO pode ter nenhum dado além da chave de relacionamento

·  Convenção para Nome da tabela: deve ser composto pelo nome de ambas as tabelas relacionadas, 
  
em ordem alfabética e no plural, com underscore (_) como separador 

Tab Lado Associativo

  Tab Lado 1 Relação Tab Outro Lado 1   FK  
Hds_Equipamentos   HDs N ó N Equipamentos   hd_id equipamento_id  
SlotPlacaRedes_Equipamentos   SlotPlacaRedes N ó N Equipamentos   slotplaca_id equipamento_id  
SistOpers_Equipamentos   SistOpers N ó N Equipamentos   so_id equipamento_id  

  NxN –Lado N (Equipamentos)

Alterar o model

Incluir: “has_and_belongs_to_many : outroladoN” (com “s”) has_and_belongs_to_many :hds
has_and_belongs_to_many :slotplacaredes
has_and_belongs_to_many :sistopers

 NxN – Outro Lado N (Hds)

Alterar o model

Incluir: “has_and_belongs_to_many :ladoN” (com “s”) has_and_belongs_to_many :equipamentos

 Obs: Lado Associativo só possue tabela no banco, não possui Model 

Obs1: para esse sistema: outras tabs com NxN para Equipamentos : 

NxN – Outro Lado N (SlotPlacaRedes)

Alterar o model

Incluir: “has_and_belongs_to_many :ladoN” (com “s”) has_and_belongs_to_many :equipamentos

 NxN – Outro Lado N (SistOpers)

Alterar o model

Incluir: “has_and_belongs_to_many :ladoN” (com “s”) has_and_belongs_to_many :equipamentos

   Relacionamentos NxN: (tem vários através de) 

·  Relacionamento NxN polimórfico – a tabela associativa tem outros dados além da chave de relacionamento 

1xNx1 – Lado 1 (Lado1 exemplo)

Alterar o model

Incluir: “has_many :ladoN”, :though => :lado_associativo (com “s” no has many, sem “s” no though) has_many :outro_lado1s, :though => :lado_associativo

 1xNx1 – OutroLado 1 (OutroLado1 exemplo)

Alterar o model

Incluir: “has_many :ladoN”, :though => :lado_associativo (com “s” no has many, sem “s” no though) has_many :lado1s, :though => :lado_associativo

 1xNx1 – LadoN (Lado_Associativo exemplo)

Alterar o model

·          Incluir: “belongs_to lado1” (sem “s”)·          Incluir: “belongs_to outro_lado1” (sem “s”) belongs_to :lado1
belongs_to :o utro_lado1

  
 

Relacionamentos 1×1: (tem um) 

(só um exemplo: 1 equipamento tem 1 equipamento_complementar 

1×1 – Lado 1_principal (Equipamentos – só exemplo)

Alterar o model

Incluir: “has_one :lado1_complementar(sem “s”) has_one :equipamento_complementars (só um exemplo, não é da aplicação)

 1×1 – Lado 1_complementar (Equipamento_Complementar – só exemplo)

Alterar o model

Incluir: “belongs_to lado1” (sem “s”) belongs_to :equipamento_complementar

  

2 Respostas para “Relacionamento no Rails”

  1. Luiz Arão Carvalho Diz:

    Otimo Artigo.
    mas ficou a duvida quanto ao uso em codigo
    tipo, como faço para associar um objeto no
    relacionamento NxN??

  2. Sandra C Bibries Diz:

    Luiz, obrigado pelo comentário.
    Como dito no artigo, o código para associar NxN deve ser colocado nos models: has_and_belongs_to_many ou “has_many … :though => :lado_associativo, … belongs_to, dependendo o caso.

    Não sei se entendi sua pergunta, poderia ser mais específico ?

Deixar uma Resposta