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 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 |
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 |
Maio 16, 2008 ás 2:02 pm |
Otimo Artigo.
mas ficou a duvida quanto ao uso em codigo
tipo, como faço para associar um objeto no
relacionamento NxN??
Maio 20, 2008 ás 9:14 am |
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 ?