JavaFree.org | RubyOnBr.org

generalização/especialização com ActiveRecord

Acompanhar generalização/especialização com ActiveRecord 7 posts, 5 participantes

Avatar Eli 44 posts

Olá pessoal,

Estou precisando resolver uma situação de generalização/especialização da minha modelagem no Rails e estou apanhando um pouco.

A principio achei q resolveria apenas usando uma herança simples, mas vejo que não esta funcionando. Tentei fazer da sequinte forma:

Porém quando instancio a classe Person, ele esta pegando apenas os atributos da tabela contacts do meu BD, ele simplesmente ignora os campos da tabela people.

Qual é a forma correta de se fazer esta generalização/especialização? Alguém tem alguma dica?

Valeu!!!

 
Petergriffinbe7 Marcos Rubin... 66 posts

Para usar single-table inheritance, crie uma coluna type de tipo string na tabela Contacts. Nesse caso, todos os atributos de Company e Person ficam nessa tabela.

 
Avatar Urubatan 145 posts

pelo que ele escreveu ele esta querendo utilizar table per class, e não single table inheritance …
mas sinceramente eu nunca tentei utilizar herança em modelos para o Rails, normalmente acho que composição faz melhor o trabalho :D

 
Avatar Neves 162 posts

Urubatan,

Quase sempre composição é melhor que herança. Mas tem certos casos que não consigo ver como fazer usando composição. Este é um exemplo: http://twelvelabs.com/singletable/index.html
Vc saberia me dizer como fazê-lo com composição?

 
Avatar Eli 44 posts

Pois é… realmente a idéia inicial, que tinha previsto no MER seria utilizar table per class, mas estou desistindo devido as complicações do AR. Então estou resolvendo ussando STI mesmo pra facilitar, apesar de não achar ser esta a melhor solução.

Mas realmente seria interessante descobrir como fazer table per class, pois existem situações que isto faz muita falta.

 
Avatar Rondy 65 posts

Isso tem jeitão de Associação Polimórfica.

Aqui logo de cara já mata teu exemplo.
http://wiki.rubyonrails.org/rails/pages/UnderstandingPolymorphicAssociations

E aqui outras cositas más.
http://wiki.rubyonrails.org/rails/pages/PolymorphicAssociations

 
Petergriffinbe7 Marcos Rubin... 66 posts

Pois é, daria pra amarrar com associação polimórfica, criando uma associação “contactable” pra fazer a amarração com Company e Person. Aí se houver comportamento para compartilhar você pode criar um módulo.

STI por outro lado não é uma maravilha nem pela ótica da pureza de design nem pela eficiência, mas é tão simples em Rails que é difícil de ignorar.