Re: [rails-br] Dúvida Sobre Herança em Rails

592 views
Skip to first unread message

Rodolfo S. Carvalho

unread,
Mar 18, 2010, 1:37:31 PM3/18/10
to rail...@googlegroups.com
Olá  Nonato.

2010/3/18 Nonato <nen_n...@hotmail.com>
Boa tarde.

Gostaria de tirar uma dúvida de como tratar com heranças no rails.
Imaginando, por exemplo, as 3 seguintes classes:
--------------------
Pessoa
 @nome
 @email
--------------------

----------------------------------------
PessoaFisica < Pessoa
 @cpf
----------------------------------------

----------------------------------------
PessoaJuridica < Pessoa
 @cnpj
----------------------------------------

Seguindo o padrão normal de modelagem, seriam 3 tabelas,
Mas eu ainda não consegui visualizar como o Rails trabalharia
nesse caso. Por favor, peço que vocês me orientem, eu realmente
preciso entender essa questão de herança no rails.

Não sei como funcionaria um CRUD nessa situação, se eu tivesse
que, por exemplo, salvar uma nova pessoa jurídica no banco.

Sei que esse exemplo pode ser bem simples, mas eu só preciso
enxergar a maneira correta de trabalhar herança com o rails, e
esse exemplo vai me servir bem como ilustração.


O ActiveRecord trabalha com Single Table Inheritance (STI). para ler mais a respeito, vá até a documentação do rails:


pesquise por "single table inheritance" na pagina (com Ctrl+F mesmo), e vc vai achar coisas a respeito.

Mais informações:
 
Grato,
Nonato.

--
Você está recebendo esta mensagem porque se inscreveu no grupo "rails-br" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para rail...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para rails-br+u...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/rails-br?hl=pt-BR.




--
   Rodolfo Carvalho
    Web Developer
rodol...@gmail.com

Tulio Ornelas

unread,
Mar 18, 2010, 8:15:47 PM3/18/10
to rail...@googlegroups.com

Wilker

unread,
Mar 19, 2010, 10:25:50 AM3/19/10
to rail...@googlegroups.com
class Pessoa < ActiveRecord::Base
end

class PessoaFisica < Pessoa
  set_table_name "PessoaFisica"
end

class PessoaJuridica < Pessoa
  set_table_name "PessoaJuridica"
end

mas eu sinceramente recomendaria voce adaptar seu modelo de tabelas ao rails sim...
---
Wilker Lúcio
Ruby on Rails Consultant
Bit Zesty
http://www.bitzesty.com
+55 81 87417674


2010/3/19 Nonato <nen_n...@hotmail.com>
Olá, agradeço a resposta de todos.

Mas minha dúvida é justamente se eu tenho que
mudar a forma comum de programar para adotar
a maneira rails??

Eu tenho um banco de dados já modelado e pronto
que trabalha com PHP e salva os dados da forma
antiga, ou seja, as informações da classe Pessoa
vai para a tabela "Pessoas" e as informações da
classe PessoaJuridica  vai para a tabela PessoaJuridica.

Nesse caso eu terei que adaptar todo o banco, pra pode
trabalhar com apenas uma Tabela que, em si própria,
contenha todos campos referente tanto a PessoaFisica
quanto a PessoaJuridica??

Não é meio estranho eu ter esses campos extras na mesma
tabela?? No exemplo que eu cite, só há um campo diferente
para cada classe (@cpf e @cnpj). Mas se eu tivesse varias
subclasses, com vários campos diferentes, eu vou ter que
colocar todos esses campos numa só tabela??

Se for isso, eu realmente, acho extremamente deselegante.
Mas eu peço que me corrijam se eu estiver enganado, por favor.

Ainda estou engatinhando no rails, por isso não consigo
visualizar algumas coisas que para muitos de vocês, são
obvias, rsrsr.

grato,
Nonato

Tulio Ornelas

unread,
Mar 19, 2010, 10:43:40 AM3/19/10
to rail...@googlegroups.com
Não concordo Wilker, existem várias estratégias para isso, e na minha opinião, uma tabela única é a pior...

Wilker

unread,
Mar 19, 2010, 10:49:05 AM3/19/10
to rail...@googlegroups.com
Tulio, eu não quiz dizer pra ele usar STH, so disse pra ele seguir as patterns do rails, em geral eu também sou contra STH, exceto em casos onde os dados sao os mesmos (ou quase, no maximo 2 campos de diferenca), a logica é similar e diverge nos filhos em alguns detalhes, ai é um bom caso para o STH, mas nos demais existem várias outras estratégias que podem ser adotadas, mas tudo depende da arquitetura da aplicação.

---
Wilker Lúcio
Ruby on Rails Consultant
Bit Zesty
http://www.bitzesty.com
+55 81 87417674


2010/3/19 Tulio Ornelas <ocul...@gmail.com>

bpfg_s...@yahoo.com.br

unread,
Mar 19, 2010, 1:09:47 PM3/19/10
to rails-br
Olá

desculpem a minha ignorância,
mas o que seria STH?? rsrs

Essa questão de trabalhar com heranças com rails me incomoda bastante.
Eu faço da minha maneira, mas
sempre me pergunto se existe uma "forma mais adequada" de trabalhar
com subclasses nessa situação, principalmente no que diz respeito a
CRUD e modelagem de tabelas.

Como seria a "forma mais adequada" de se trabalhar com essa questão no
Rails??

Abraços,
Beto Polione.

Wilker

unread,
Mar 19, 2010, 1:15:50 PM3/19/10
to rail...@googlegroups.com
Não existe "forma mais adequada" de maneira geral, tudo depende do contexto da sua a aplicação, essa é a parte boa do Ruby/Rails, ele é flexivel o bastante para voce usar as coisas como for melhor para sua cituação.

O correto é STI e não STH (sorry)

STI - Single Table Inheritance


---
Wilker Lúcio
Ruby on Rails Consultant
Bit Zesty
http://www.bitzesty.com
+55 81 87417674


Wilker

unread,
Mar 19, 2010, 1:58:15 PM3/19/10
to rail...@googlegroups.com
Voce ja pensou em usar um banco de documentos no lugar de um banco relacional? Eu acho que ele se adequa muito melhor a sua cituacao, tente o MongoDB, usando no Rails com o MongoMapper ou o mais recente LightMongo

Usando um banco de documentos vai ser muito mais tranquilo pra voce fazer isso ;)

---
Wilker Lúcio
Ruby on Rails Consultant
Bit Zesty
http://www.bitzesty.com
+55 81 87417674


2010/3/19 Nonato <nen_n...@hotmail.com>
Agora consegui postar, heheh

Beto, eu acho que STH deve ser algo relacionado
ao que eu li, o "Single Table Inheritance".

Pessoal, a questão que eu tenho é a seguinte:

Tendo uma classe "Automovel", junto com as subclasses:
"Carro", "Moto", "Barco", "Caminhao", "Aviao", "Onibus",
onde cada uma dessas 6 subclasses tem, no mínimo 7 atributos
específicos de cada uma delas.

Eu teria q modelar um "tabelão" com 42 campos (7x6) extras,
sendo que cada linha de registro na tabela só usaria uns 10
campos, ou seja, iriam sobrar mais de 30 campos para cada
registro. Eu enxergo isso como uma forma "extremamente" deselegante
de se resolver um problema, pois, sem dúvida alguma, a melhor
forma seria criar uma tabela para cada subclasse.

Gostaria de uma orientação quanto a isso, pois, como havia dito,
ainda estou engatinhando no rails. Por favor, alguém poderia
me mostrar uma melhor alternativa, para não ter que usar
"Single Table Inheritance", uma vez que ficaria extremamente
fora dos padrões "corretos" de modelagem de banco de dados.


Agradeço desde já,
Nonato.

bpfg_s...@yahoo.com.br

unread,
Mar 19, 2010, 3:22:55 PM3/19/10
to rails-br
Wilker, bem legal essa altenativa.
Poderia utilizar também o couchDB que é orientado a objetos.


Mas, só por questão de aprendizado e curiosidade, como vocês
resolveriam isso se "tivesse" que usar banco de dados relacional??

Gostaria de saber a opinião de vocês quanto a isso, pois, assim como o
Nonato, eu também estou engatinhando no rails e afinal de contas, é
sempre um aprendizado escutar as dicas de quem já tem experiência no
assunto.

Abraços,
Beto Polione.

Wilker

unread,
Mar 19, 2010, 3:58:11 PM3/19/10
to rail...@googlegroups.com
Uma saida que eu imagino seria ter os dados comuns em uma tabela, e delegar os dados especificos para outras tabelas, criando registros relacionados, exemplo:

Veiculos
id
nome
cor
ano
motor
type
dados_especificos_id

CarData
id
ar_condicionado
farol_de_milha

TruckData
id
numero_de_rodas

...

Por ai vai, e criar um relacionamento polimorfico no dados_especificos_id com uma das classes ***Data de acordo com o type do veiculo.

ps: nao ligue para os campos q eu criei, n domino o sistema e sai criando campos q sariam da minha kbca, mas a ideia e a mesma.

E voce poderia ate redefinir o method_missing da classe veiculo para ele tentar automaticamente achar os campos especificos dentro dos registros relacionados, de forma a facilitar a interface da classe.


---
Wilker Lúcio
Ruby on Rails Consultant
Bit Zesty
http://www.bitzesty.com
+55 81 87417674



--

Tulio Ornelas

unread,
Mar 19, 2010, 4:32:33 PM3/19/10
to rail...@googlegroups.com
Também faria com relacionamento polimorfico.

bpfg_s...@yahoo.com.br

unread,
Mar 20, 2010, 7:07:27 PM3/20/10
to rails-br
Só pra eu ver se entendi, ficaria assim:

Class Veiculos < ActveRecorde::Base
@id
@nome
@cor
@ano
@motor
@type
@dados_especificos_id
end

Class CarData < Veiculos
@id
@ar_condicionado
@farol_de_milha
end

Clas TruckData < Veiculos
@id
@numero_de_rodas
end


No meu controller, eu vou poder trabalhar com essas
classes fazendo operações como essas?:

@carro = CarData.new
@caminhao = TrukData.find_by_ano(2000)
@carro.save

E ele vai salvar automaticamente nas tabelas referente
a cada classe???

Eu dei uma lida sobre Associação Polimórfica, mas não
consigo ligar isso ao conceito de herança. Peço que
vocês me ajudem, por favor.

Muito grato, desde já,
Beto Polione

Vinicius Tassinari

unread,
Mar 20, 2010, 7:16:00 PM3/20/10
to rail...@googlegroups.com, rails-br
Procure por accept_nested_attributes_for, ou veja em http://weblog.rubyonrails.org/2009/1/26/nested-model-forms o conceito de formulário com dados aninhados ou um exemplo da utilização do "build" para relacionamentos has_many.

Enviado de meu iPhone

Wilker

unread,
Mar 21, 2010, 1:44:35 PM3/21/10
to rail...@googlegroups.com
A idéia que nós sugerimos com polimorfic association é realmente você ter 2 modelos para a classe, um portando os dados gerais, e outro com os dados especificos ;)

---
Wilker Lúcio
Ruby on Rails Consultant
Bit Zesty
http://www.bitzesty.com
+55 81 87417674


2010/3/21 Nonato <nen_n...@hotmail.com>
Pessoal,

eu estou dando uma estudada em associação polimófica pra
poder usá-lo em heranças, como no exemplo acima. Mas parece
tudo estranho. Não sei se é pelo fato de não estar habituado.

Porque em linguagens como o C#.net por exemplo, eu iria poder
acessar um atributo da classe pai (Automovel) diretamente,
utilizando algo como:

Carro meuCarro = new Carro;
meuCarro.cor = "Vermelho";

Já no rails, parece q temos q instanciar dois objetos, cado um
objeto referente à uma classe especifica (Veiculo e Carro).
Depois fazer uma atribuição da objeto @carro dentro do objeto
@veiculo.

E não consegui ver um exemplo que utilize acesso direto, como
no caso acima (a não ser que eu utilize STI, q não é o caso).

Provavelmente eu ja tow sendo chato, mas é que ainda não consegui
compreender a como isso funciona no Rails. Será que alguém poderia
só escrever um exemplo em Rails comparando com o exemplo acima em C#?

Muito grato,
Nonato

bpfg_s...@yahoo.com.br

unread,
Mar 21, 2010, 2:11:36 PM3/21/10
to rails-br
Olá Vinicius, obrigado pelo link.

Eu tava pesquisando, e vi algumas pessoas comentando
sobre composição em vez de herança.

Como funcionaria isso utilizando composição no rails??


Beto Polione

Gustavo Sales

unread,
Mar 21, 2010, 2:42:13 PM3/21/10
to rail...@googlegroups.com
Nonato,

Por padrão o rails utiliza o ActiveRecord como ORM. Como já foi dito, o
AR implementa herança usando o pattern STI.

http://www.martinfowler.com/eaaCatalog/singleTableInheritance.html

O DataMapper tbém usa STI...

Se você tem um db legado, acho que ter que lidar com as associações...

[]'s

Gustavo

On Sun, 21 Mar 2010 09:52:36 -0700 (PDT), Nonato <nen_n...@hotmail.com>
wrote:

Vinicius Tassinari

unread,
Mar 21, 2010, 3:07:59 PM3/21/10
to rail...@googlegroups.com, rails-br
Da uma olhada de como utilizar o conceito de associações em
http://guias.rubyonrails.pro.br/association_basics.html

Enviado de meu iPhone

Em 21/03/2010, às 15:11, bpfg_s...@yahoo.com.br <bpfg_s...@yahoo.com.b
r> escreveu:

> --
> Você está recebendo esta mensagem porque se inscreveu no grupo "rail
> s-br" dos Grupos do Google.
> Para postar neste grupo, envie um e-mail para rail...@googlegroups.com
> .

> Para cancelar a inscrição nesse grupo, envie um e-mail para rails-br+unsubscribe@googlegroups.c

bpfg_s...@yahoo.com.br

unread,
Mar 21, 2010, 5:53:15 PM3/21/10
to rails-br
Comecei a entender um pouco melhor.

Só que eu encontrei algumas pessoas criticando
à repeito de que utilizando associação polimofica
a gente perde o conceito de metodos polimorficos.

Eu realmente acho q isso é verdade, já q as classes
filhas (Carro, Moto), não vão herdar os métodos da
classe pai (Automovel).

Há como contornar isso??

Beto Polione

Vinícius Tassinari da silva

unread,
Mar 21, 2010, 6:27:01 PM3/21/10
to rails-br
Beto,

Nativamente o ActiveRecord do Rails so trabalha em STI (Single Table
Inheritance), n�o trabalha com CTI (Class Table Inheritance) que seria a
forma que voce precisa, na forma CTI voce teria que implementar tudo na m�o,
ai acho que voce acaba fugindo um pouco do conceito do Rails, e isso poderia
te trazer muito trabalho.

Abs

Vin�cius

--------------------------------------------------
From: <bpfg_s...@yahoo.com.br>
Sent: Sunday, March 21, 2010 6:53 PM
To: "rails-br" <rail...@googlegroups.com>
Subject: [rails-br] Re: D�vida Sobre Heran�a em Rails

> Comecei a entender um pouco melhor.
>

> S� que eu encontrei algumas pessoas criticando
> � repeito de que utilizando associa��o polimofica


> a gente perde o conceito de metodos polimorficos.
>

> Eu realmente acho q isso � verdade, j� q as classes
> filhas (Carro, Moto), n�o v�o herdar os m�todos da
> classe pai (Automovel).
>
> H� como contornar isso??
>
> Beto Polione
>
> --
> Voc� est� recebendo esta mensagem porque se inscreveu no grupo "rails-br"

> dos Grupos do Google.
> Para postar neste grupo, envie um e-mail para rail...@googlegroups.com.

> Para cancelar a inscri��o nesse grupo, envie um e-mail para
> rails-br+u...@googlegroups.com.
> Para obter mais op��es, visite esse grupo em
> http://groups.google.com/group/rails-br?hl=pt-BR.
>

Vinícius Tassinari da silva

unread,
Mar 21, 2010, 6:33:35 PM3/21/10
to rails-br
Beto,

Mas h� alternativas, existem plugins, um deles �:
http://github.com/sava/class_table_inheritance/

No caso para o reaproveitamento de m�todos voce poderia utilizar Modulos nas
models.

Abs

Vinicius

--------------------------------------------------
From: <bpfg_s...@yahoo.com.br>
Sent: Sunday, March 21, 2010 6:53 PM
To: "rails-br" <rail...@googlegroups.com>
Subject: [rails-br] Re: D�vida Sobre Heran�a em Rails

> Comecei a entender um pouco melhor.
>


> S� que eu encontrei algumas pessoas criticando

> � repeito de que utilizando associa��o polimofica


> a gente perde o conceito de metodos polimorficos.
>

> Eu realmente acho q isso � verdade, j� q as classes
> filhas (Carro, Moto), n�o v�o herdar os m�todos da
> classe pai (Automovel).
>

> H� como contornar isso??
>
> Beto Polione
>
> --
> Voc� est� recebendo esta mensagem porque se inscreveu no grupo "rails-br"
> dos Grupos do Google.


> Para postar neste grupo, envie um e-mail para rail...@googlegroups.com.
> Para cancelar a inscri��o nesse grupo, envie um e-mail para
> rails-br+u...@googlegroups.com.

> Para obter mais op��es, visite esse grupo em
> http://groups.google.com/group/rails-br?hl=pt-BR.
>

Vinícius Tassinari da silva

unread,
Mar 21, 2010, 6:34:45 PM3/21/10
to rails-br
Beto

Mais um exemplo e plugin:

http://oldwiki.rubyonrails.org/rails/pages/ClassTableInheritanceInRails

Abs

Vinicius

--------------------------------------------------
From: <bpfg_s...@yahoo.com.br>
Sent: Sunday, March 21, 2010 6:53 PM
To: "rails-br" <rail...@googlegroups.com>
Subject: [rails-br] Re: D�vida Sobre Heran�a em Rails

> Comecei a entender um pouco melhor.
>


> S� que eu encontrei algumas pessoas criticando

> � repeito de que utilizando associa��o polimofica


> a gente perde o conceito de metodos polimorficos.
>

> Eu realmente acho q isso � verdade, j� q as classes
> filhas (Carro, Moto), n�o v�o herdar os m�todos da
> classe pai (Automovel).
>

> H� como contornar isso??
>
> Beto Polione
>
> --
> Voc� est� recebendo esta mensagem porque se inscreveu no grupo "rails-br"
> dos Grupos do Google.


> Para postar neste grupo, envie um e-mail para rail...@googlegroups.com.
> Para cancelar a inscri��o nesse grupo, envie um e-mail para
> rails-br+u...@googlegroups.com.

> Para obter mais op��es, visite esse grupo em
> http://groups.google.com/group/rails-br?hl=pt-BR.
>

Nonato

unread,
Mar 22, 2010, 9:42:42 AM3/22/10
to rails-br
Massa, comecei a entender melhor esse lance de associação polimórfica.

Mas, como assim perde os métodos polimórficos? Fiquei meio confuso. =]

Quanto essa técnica de composição, no que ela consiste? é a melhor
alternativa no rails, em vez de associação polimórfica??

VaLew pessoal,
esse grupo é show, vejo tantos outros lugares a galera com a maior
má vontade em responder, ao contrário de vocês, que sempre auxiliam
quem está começando. Tão de parabéns. =)

Abraços

Nonato.

bpfg_s...@yahoo.com.br

unread,
Mar 22, 2010, 12:15:57 PM3/22/10
to rails-br
Olá Nonato,

segundo o que eu entedi, composição vc vai incluindo os módulos, acho
q é isso.

Mas não sei bem como funciona.

Abçs.

Beto Polione

Gustavo

unread,
Mar 21, 2010, 3:55:00 PM3/21/10
to rail...@googlegroups.com
http://code.alexreisner.com/articles/single-table-inheritance-in-rails.html



2010/3/21 Vinicius Tassinari <vinici...@uol.com.br>
Da uma olhada de como utilizar o conceito de associações em
http://guias.rubyonrails.pro.br/association_basics.html

Enviado de meu iPhone

Em 21/03/2010, às 15:11, bpfg_s...@yahoo.com.br <bpfg_s...@yahoo.com.br> escreveu:
Olá Vinicius, obrigado pelo link.

Eu tava pesquisando, e vi algumas pessoas comentando
sobre composição em vez de herança.

Como funcionaria isso utilizando composição no rails??


Beto Polione

--
Você está recebendo esta mensagem porque se inscreveu no grupo "rails-br" dos Grupos do Google.

Para postar neste grupo, envie um e-mail para rail...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para rails-br+u...@googlegroups.com.

Para obter mais opções, visite esse grupo em http://groups.google.com/group/rails-br?hl=pt-BR.


--
Você está recebendo esta mensagem porque se inscreveu no grupo "rails-br" dos Grupos do Google.

Para postar neste grupo, envie um e-mail para rail...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para rails-br+u...@googlegroups.com.
Reply all
Reply to author
Forward
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted
0 new messages