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?
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?