Dúvida: Modelo com duas chaves estrangeiras da mesma tabela

443 views
Skip to first unread message

Lucas Húngaro

unread,
Sep 13, 2007, 11:56:34 PM9/13/07
to rail...@googlegroups.com
Fala pessoal!

Estou começando em Rails com um pequeno projeto passado na faculdade. Já fiz algo bem semelhante utilizando Java e Hibernate, mas estou em dúvida no uso do ActiveRecord.

Possuo as seguintes entidades:

Produto
 - Id
 - Nome

Unidade
 - Id
 - Sigla
 - Nome
 
Conversao
 - Produto_id
 - Unidade_origem
 - Unidade_destino
 - Fator

Um produto é comprado em uma unidade (exemplo: metros cúbicos) e vendido em outra unidade (exemplo: quilogramas). Um produto pode ter mais de uma associação desse tipo (um par de unidades), por isso há essa entidade Conversão, que guarda os pares de unidades e um fator de conversão entre elas.

A dúvida é: como consigo colocar duas chaves estrangeiras apontando para a mesma tabela na migração e no modelo da entidade Conversão?

Pelo que li até agora, na migração é só colocar <nome_do_modelo>_id e depois fazer a configuração correta no modelo (has_one, belongs_to etc) para criar o relacionamento... mas como seria isso com duas chaves? Duas colunas unidade_id??


--
Lucas Húngaro
Visite meu blog sobre Ruby on Rails:
http://lucashungaro.wordpress.com/

Cristiano Dias

unread,
Sep 14, 2007, 8:49:10 AM9/14/07
to rail...@googlegroups.com
Opa,

Você precisa de uma classe no meio, de relacionamento, que use
has_and_belongs_to_many com os atributos foreign_key e
association_foreign_key.

Um bom começo é esse guia:
http://blog.invisible.ch/files/rails-reference-1.1.html#modelrelations


--
CrisDias
www.vilago.com.br, seu site vai gostar de morar aqui

Taner Pereira

unread,
Sep 14, 2007, 9:03:29 AM9/14/07
to rails-br
Tchê, acho que tu tens que fazer o seguinte, primeiro mudar teu
unidade_origem para unidade_id para seguir as convenções.

No outro campo tu adiciona mais um belongs_to.

belongs_to :unidade
belongs_to :unidade, :foreign_key=>"unidade_destino"

Acho que aqui é um caso de um "has_and_belongs_to_many" melhorado, daí
recomendo o uso da cláusula :through, consulte o Google.

Esse é um bom tópico para colocar no meu blog também ehhehe,
http://rsrails.blogspot.com

Vou colocar um how-to disso lá.

Falou

Bruno Reis

unread,
Sep 14, 2007, 1:02:24 PM9/14/07
to rail...@googlegroups.com
Lucas,
 
Se é que isso ajuda, eu sei que dá, mas não sei a sintaxe. Eu lembro de ter lido na documentação que você pode definir o nome da associação e também o nome da tabela que ela usa, ficando assim cada associação com um nome, mas referenciando a mesma tabela.  Sei que tem no livro "Agile Web Development with Ruby on Rails".

Alguém aqui deve saber.

Bruno P Reis

Em 13/09/07, Lucas Húngaro <lucash...@gmail.com> escreveu:

Taner Pereira

unread,
Sep 14, 2007, 1:02:49 PM9/14/07
to rails-br
Também estou com este problema, tentei o seguinte:

Classe Categoria
has_many :receitas

Classe Receita
belongs_to :categoria1, :class_name=>"Categoria", :foreign_key=>"categoria_id"
belongs_to :categoria2, :class_name=>"Categoria", :foreign_key=>"categoria_2nd"

Quando faço um teste no console por:
r = receita.find 1
r.categoria1.nome dá o erro: "undefined method `primario' for
#<Receita:0x47a47a8>"

Se eu utilizar apenas:
belongs_to :categoria
r = receita.find 1
r.categoria.nome
=>"Lanches"

E agora?? Alguém já teve este tipo de problema?

On 14 set, 00:56, "Lucas Húngaro" <lucashung...@gmail.com> wrote:

Bruno Reis

unread,
Sep 14, 2007, 3:43:11 PM9/14/07
to rail...@googlegroups.com
achei! Você não configura a coluna, você configura o atributo da classe. E tem como especificar detalhes, veja o seguinte código:



belongs_to :unidade_origem,
  :class_name => "Unidade",
  :association_foreign_key => "unidade_origem_id", # essas duas podem estar trocadas.!
  :foreign_key => "unidade_id"

belongs_to :unidade_destino,
  :class_name => "Unidade",
  :association_foreign_key => "unidade_destino_id", # essas duas podem estar trocadas.!
  :foreign_key => "unidade_id"



Em 13/09/07, Lucas Húngaro <lucash...@gmail.com> escreveu:
Fala pessoal!

Sylvestre Mergulhão

unread,
Sep 14, 2007, 4:08:13 PM9/14/07
to rail...@googlegroups.com
Escrevi um pouco sobre associações com activerecord no meu blog, em:

http://mergulhao.info/2007/5/18/associacoes-com-activerecord

Talvez ajude em algo.

Abraço!

--
Sylvestre Mergulhão - Free Software Development
-----------------------------------------------------------------------
http://mergulhao.info
http://www.euemeu.com

Lucas Húngaro

unread,
Sep 18, 2007, 9:03:26 PM9/18/07
to rail...@googlegroups.com
Valeu Bruno!

Em 14/09/07, Bruno Reis <bruno....@gmail.com> escreveu:
Reply all
Reply to author
Forward
0 new messages