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

Responder a