Herança em tabelas separadas

E aí pessoal,

 Estou precisando resolver um problema de herança no com rails, mas não quero utilizar o esquema de herança em uma única tabela. Vocês conhecem algum esquema que nos permite realizar herança em tabelas separadas em rails?

Tudo jóia anderson_lr?

Cara, pode detalhar um pouco mais o seu problema? O que você está precisando fazer em sua aplicação?

Oi Ricardo,

 Posso sim, o problema é o seguinte. Tenho uma tabela funcionário, mas tenho funcionários administrativos e professores. Preciso que professores e administrativos extendam de funcinário. Mas gostaria que cada model tivesse sua tabela separada no banco de dados.

Entendi anderson_lr, que acha do seguinte: o que você realmente precisa é que o “comportamento” de um Funcionario seja aplicável tanto a Professor quanto a FuncionarioAdministrativo, certo?

Existem algumas formas de lidar com isso, vou sugerir duas:

Você poderia usar um módulo que isola o comportamento de Funcionario, e incluir esse módulo em seus ActiveRecord’s, algo como o seguinte:

module Funcionario
  def recebe_pagamento
    puts "funcionario #{self.nome} foi pago"
  end

  def trabalha
    puts "#{self.nome} trabalha"
  end
end

class Professor < ActiveRecord::Base
  include Funcionario

  def da_aula
    self.trabalha
    puts "ensina"
  end
end

class FuncionarioAdministrativo < ActiveRecord::Base
  include Funcionario

  def administra
    self.trabalha
    puts "faz o que tem que fazer..."
  end
end

Nesse exemplo, o módulo funcionario acessa a propriedade nome, estou considerando que tanto Professor quanto FuncionarioAdministrativo têm :nome.
Existe uma outra opção que é compor o seus modelos com um objeto do tipo funcionário (que é uma abordagem que acho até mais interessante):

class Funcionario
  def initialize(nome)
    @nome = nome
  end

  def recebe_pagamento(valor)
    puts "funcionario #{@nome} foi pago"
  end

  def trabalha
    puts "todo funcionario... trabalha"
  end
end

class Professor < ActiveRecord::Base
  def funcionario
    @funcionario ||= Funcionario.new(self.nome)
    @funcionario
  end

  def da_aula
    funcionario.trabalha
    puts "ensina"
  end

  def recebe_pagamento(dimdim)
    funcionario.recebe_pagamento(dimdim)
  end
end

class FuncionarioAdministrativo < ActiveRecord::Base
  def funcionario
    @funcionario ||= Funcionario.new(self.nome)
    @funcionario
  end

  def administra
    funcionario.trabalha
    puts "faz o que tem que fazer..."
  end

  def recebe_pagamento(dimdim)
    funcionario.recebe_pagamento(dimdim)
  end
end

Em qualquer uma das soluções você pode ter uma classe Escola (só para dar exemplo) que usa Professor, FuncionarioAdmininstrativo ou ainda um método que pode receber qualquer um dos tipos:

class Escola
  def sala_de_aula(professor)
    professor.da_aula
  end

  def escritorio(funcionario)
    funcionario.administra
  end

  def paga(funcionario)
    funcionario.recebe_pagamento 500
  end
end

professor = Professor.first
funcionario = FuncionarioAdministrativo.first

escola = Escola.new

escola.sala_de_aula(professor)
escola.paga(professor)

escola.escritorio(funcionario)
escola.paga(funcionario)

Será que isso resolve?