Mehrere Relationen zum selben Modell in Rails

Let's say I have two models, Classes and People. A Class might have one or two People as instructors, and twenty people as students. So, I need to have multiple relationships between the models -- one where it's 1->M for instructors, and one where it's 1->M for students.

Bearbeiten: Lehrer und Schüler müssen gleich sein; Ausbilder könnten Schüler in anderen Klassen sein und umgekehrt.

Ich bin mir sicher, dass das ziemlich einfach ist, aber Google zieht nichts Relevantes an und ich finde es einfach nicht in meinen Büchern.

0

2 Antworten

Es gibt viele Möglichkeiten hier, aber unter der Annahme, dass Lehrer immer Lehrer sind und Schüler immer Schüler sind, können Sie Vererbung verwenden:

class Person < ActiveRecord::Base; end  # btw, model names are singular in rails
class Student < Person; end
class Instructor < Person; end

dann

class Course < ActiveRecord::Base  # renamed here because class Class already exists in ruby
  has_many :students
  has_many :instructors
end

Denken Sie jedoch daran, dass für die Funktion der Vererbung einzelner Tabellen eine Spalte type in der Tabelle people erforderlich ist.

Mithilfe eines Zuordnungsmodells könnte Ihr Problem gelöst werden

class Course < ActiveRecord::Base
  has_many :studentships
  has_many :instructorships
  has_many :students,    :through => :studentships
  has_many :instructors, :through => :instructorships
end

class Studentship < ActiveRecord::Base
  belongs_to :course
  belongs_to :student, :class_name => "Person", :foreign_key => "student_id"
end

class Instructorship < ActiveRecord::Base
  belongs_to :course
  belongs_to :instructor, :class_name => "Person", :foreign_key => "instructor_id"
end
0
hinzugefügt
Hey, das ist ziemlich schlau, aber leider könnte jemand sowohl ein Lehrer als auch ein Schüler sein, also glaube ich nicht, dass das so funktioniert wie es ist.
hinzugefügt der Autor Tim Sullivan, Quelle
Ah, habe gerade deine Bearbeitung gesehen! Fantastisch!
hinzugefügt der Autor Tim Sullivan, Quelle
haha, das war lange her, aber sollten die Beziehungen nicht has_many sein: durch beide Richtungen gehen? Eine Person sollte mehr als einen Kurs unterrichten können?
hinzugefügt der Autor wuliwong, Quelle

In meinem Fall habe ich Asset und User-Modell Das Asset kann von einem Benutzer erstellt und einem Benutzer zugewiesen werden und Benutzer kann viele Assets erstellen und viele Assets haben Lösung meines Problems war     Asset.rb

class Asset < ActiveRecord::Base

belongs_to :creator ,:class_name=>'User'
belongs_to :assigned_to, :class_name=>'User' 

end

und

user.rb

class User < ActiveRecord::Base

has_many :created_assets, :foreign_key => 'creator_id', :class_name => 'Asset'
has_many :assigned_assets , :foreign_key => 'assigned_to_id', :class_name => 'Asset'

end

So könnte deine Lösung sein

class Course < ActiveRecord::Base
has_many :students ,:foreign_key => 'student_id', :class_name => 'Person'
has_many  :teachers, :foreign_key => 'teacher_id', :class_name => 'Person'

end

und

class Person < ActiveRecord::Base
belongs_to  :course_enrolled,:class_name=>'Course'
belongs_to  :course_instructor,:class_name=>'Course'

end
0
hinzugefügt
Beschränkt dies die Person nicht darauf, höchstens einen course_enrolled und einen course_instructor zu haben? Ich denke, um es vollständig einzurichten, müssen sie has_many sein: durch Assoziationen.
hinzugefügt der Autor wuliwong, Quelle