Valeu, estava terminando um módulo que não precisava desses relacionamentos, agora voltei neles e usei os seus conceitos e deram certos.
Valeu muito obrigado.
Clodonil
2006/11/8, Leonardo Augusto Pires <[EMAIL PROTECTED]>:
Olá!
Acho que, dá forma que você sugeriu, ficaria dessa forma:
class Usuario < ActiveRecord::Base
end
class Aluno < Usuario
has_and_belongs_to_many :cursos, :join_table => 'alunos_cursos'
end
class Professor < Usuario
has_and_belongs_to_many :cursos, :join_table => 'cursos_professores'
end
class Curso < ActiveRecord::Base
has_and_belongs_to_many :alunos, :join_table => 'alunos_cursos'
has_and_belongs_to_many :professores, :join_table => 'cursos_professores'
end
(Note que eu adicionei o plural de professores:
Inflector.inflections do |inflect|
inflect.irregular 'professor', 'professores'
end)
E os migrations que usei para o schema:
class CreateUsuarios < ActiveRecord::Migration
def self.up
create_table 'usuarios' do |t|
t.column 'nome', :string
t.column 'type', :string
end
create_table 'alunos_cursos', :id => false do |t|
t.column 'aluno_id', :integer
t.column 'curso_id', :integer
end
create_table 'cursos_professores', :id => false do |t|
t.column 'curso_id', :integer
t.column 'professor_id', :integer
end
end
def self.down
drop_table 'usuarios'
drop_table 'alunos_cursos'
drop_table 'cursos_professores'
end
end
class CreateCursos < ActiveRecord::Migration
def self.up
create_table 'cursos' do |t|
t.column 'nome', :string
end
end
def self.down
drop_table 'cursos'
end
end
O has_and_belongs_to_many usa uma tabela *implicitamente* para guardar
a relação entre os objetos envolvidos; isso é, ele não usa uma classe
para representar a relação. Justamente por isso fica difícil guardar
atributos sobre ela; por exemplo, o semestre em que o aluno está
fazendo aquele curso ou se ele passou ou não.
Você poderia usar o has_many em vez disso:
class Aluno < ActiveRecord::Base
has_many :cursamentos
has_many :cursos, :through => :cursamentos
end
class Curso < ActiveRecord::Base
has_many :cursamentos
has_many :alunos, :through => :cursamentos
end
class Cursamento < ActiveRecord::Base (algum nome melhor?)
belongs_to :aluno
belongs_to :curso
end
Na classe Cursamento, você poderia colocar os atributos que você quer.
Há uma boa apresentação do DHH que toca nisso:
http://blog.scribestudio.com/articles/2006/07/09/david-heinemeier-hansson-railsconf-2006-keynote-address.
Leonardo
On 11/8/06, Clodonil Trigo <[EMAIL PROTECTED] > wrote:
> Olá Pessoal,
>
> Estou precisando da ajuda de vocês. Não estou achando a solução para um
> problema de relacionamento.
>
> Tenho uma tabela Usuarios e outra Cursos. Um usuário pode ser aluno e
> professor. No caso do professor, um Professor (Usuario) pode ser vários
> cursos e um curso pode ter Vários Professores.
>
> Antes de definir a linguagem que seria utilizada, o analista projetou o
> banco de dados. E neste banco existe 2 tabelas de NxM resultante do
> relacionamento da tabela Usuario e Curso.
>
> A primeira tabela é Professor_curso ( id_Usuario e Id_curso) sendo os id
> chaves estrangeiras das tabelas mencionandas.
> A segunda é Aluno_curso (id_Usuario e Id_curso) com o mesmo schema do
> processo acima.
>
> Só que para implementar isso no Rails estive lento que a tabela do
> relacionamento tem que ser Usuarios_Cursos.
>
> Tem uma solução para isso??? Lembrando que eu não posso fazer alteração no
> banco de dados.
>
> Clodonil
>
>
> _______________________________________________
> Ruby-l mailing list
> [email protected]
> http://www.listas.unicamp.br/mailman/listinfo/ruby-l
>
>
>
_______________________________________________
Ruby-l mailing list
[email protected]
http://www.listas.unicamp.br/mailman/listinfo/ruby-l
--
Clodonil. Trigo
-------------------------------------------------------------------
UNASP-SP www.nisled.org
(11)5822-6173
_______________________________________________ Ruby-l mailing list [email protected] http://www.listas.unicamp.br/mailman/listinfo/ruby-l
