Как обрабатывать трехсторонние ассоциации в RoR? - PullRequest
0 голосов
/ 19 октября 2019

Я подаю заявление в школу, где необходим список курсов как для лекторов, так и для студентов, список лекторов для студентов и список студентов для лекторов.

Итак, у меня есть тримодели: персонал, студент и курс.

Я новичок в RoR, и ассоциации сейчас не имеют для меня особого смысла, но я хочу, чтобы у каждого сотрудника и студента было несколько курсов. Вот я и подумал has_many и belongs_to. Затем я хочу, чтобы у каждого студента был список его / ее лекторов, поэтому has_many :staff, through: :course и то же самое для сотрудников has_many :student, through: :course. Я также хочу использовать столбец патикуля для отношения, скажем course_code, а не идентификатор.

staff.rb

    has_many :courses
    has_many :students, through: :courses

student.rb

    has_many :courses
    has_many :staff, through: :courses

course.rb

    belongs_to :staff
    belongs_to :students

Это был бы лучший способ сделать это, если я хочу быть в состоянии @student.course.all и @student.lecturer.all?

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Таким образом, учащийся может пройти много курсов, персонал может преподавать много курсов, за курсами следуют 1 или более студентов, и его обучают 1 или более сотрудников. Читая это: вам нужен объединительный стол.

Тем не менее, как обычно, есть много разных подходов для этого. Позвольте мне начать с самого простого: создайте две таблицы соединения: followed_courses и lectured_courses.

Class FollowedCourse 
  belongs_to :student 
  belongs_to :course 

Class LecturedCourse 
  belongs_to :lecturer
  belongs_to :course 

Class Course 
  has_many :followed_courses 
  has_many :students, through: :followed_courses 
  has_many :lectured_courses 
  has_many :lecturers, through: :lectured_courses 

Class Lecturer 
  has_many :lectured_courses 
  has_many :courses, through: :lectured_courses

Class Student 
  has_many :followed_courses
  has_many :courses, through: :followed_courses 

(«Посох» - это запутанное слово в ruby ​​на рельсах, так как оно не имеет множественного числа:как вы указываете групповой штатный сотрудник против одного сотрудника, поэтому я предлагаю lecturer здесь, но, конечно, вы могли бы использовать учителя или что-то подобное).

Что я могу себе представить, так это то, что у человека иногда есть роль ученика, а иногда роль учителя, так что у вас может быть другая таблица соединений, называемая ParticipatingCourses, где он принадлежит_ человеку икурс, и играет роль, чтобы указать, как они участвуют: студент или преподаватель. Это немного усложняет ситуацию, поэтому я думаю, что сейчас было бы проще остаться с моим первым предложением.

0 голосов
/ 20 октября 2019

Если вы хотите, чтобы у студентов и преподавателей были курсы, вам нужно использовать полиморфную ассоциацию.

https://guides.rubyonrails.org/association_basics.html#polymorphic-associations Вот руководство, которое расскажет вам, как реализовать!

РЕДАКТИРОВАТЬ: вам не нужно использовать полиморфную ассоциацию, но это поможет высушить ваш код. Кроме того, используйте проблемы!

РЕДАКТИРОВАТЬ: Кроме того, я думаю, что вам нужен стол соединения. (Курс может иметь много студентов, и один студент может иметь много курсов).

...