458624987_1c4a9ee690

Um problema comum e uma solução trivial. É assim que posso descrever o uso de heranças em modelos no Rails.

Imagine a seguinte situação: No meu diagrama de classes tenho uma classe Person com duas subclasses, Manager e Employee. De inicio a primeira coisa que faríamos seria criar três modelos no Rails:

[source:ruby]
class Person < ActiveRecord::Base
end

class Manager < ActiveRecord::Base
end

class Employee < ActiveRecord::Base
end
[/source]

Mas como modelar as tabelas neste caso? Podemos usar o recurso de heranças do ActiveRecord e fazer tudo em cima de apenas uma tabela.

[source:sql]
create table people (
id INT AUTO_INCREMENT NOT NULL,
type VARCHAR(20),

/* atributos comuns */
name VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL,

/* atributos do gerente */
dept INT,

/* atributos do funcionario */
reports_to INT,
PRIMARY KEY (id)
);
[/source]

Note que criamos uma coluna chamada type na tabela people, é aqui que está o segredo.

Agora alteramos os modelos para que as classes Manager e Employee sejam subclasses de Person:

[source:ruby]
class Person < ActiveRecord::Base
end

class Manager < Person
end

class Employee < Person
end
[/source]

Pronto. Agora todos os modelos acessam a mesma tabela. Se você utilizar a classe Person, o ActiveRecord vai sempre retornar todas as linhas desta tabela, mas se usar Manager ou Employee ele somente tratará os registros com o tipo especificado.

Mas temos um problema aí, você vai verificar que todas as classes possuem os mesmos atributos. Mas na prática isto nem é um problema assim tão sério. Você pode simplesmente ignorar os atributos que não pertencem àquela classe. É um preço baixo a pagar por tamanha facilidade. Sem contar que isto vai lhe poupar a criação de pelo menos três tabelas, e melhorar o desempenho de sua aplicação, já que menos tabelas são menos associações.