Как настроить ассоциации в Ruby on Rails? - PullRequest
1 голос
/ 21 ноября 2011

Я создаю пример приложения для практики и не могу определить, как лучше организовать свои модели и ассоциации.Итак, давайте просто скажем, у меня есть 3 модели:

  1. Школы
  2. Классы
  3. Студенты

Я хочу:

  • школ с множеством классов
  • классов с множеством учеников
  • классов с принадлежностью к школе
  • учеников, которые будут зачислены во многие классы во многих разных школах

От ассоциаций у меня кружится голова, я не уверен, какие из них использовать.Помощь будет принята с благодарностью.

Ответы [ 3 ]

2 голосов
/ 21 ноября 2011

Переименовано class в course, так как имя класса Class уже занято. Класс присоединения, такой как enrollments, будет обрабатывать отношения многих со многими студентами <=> курса.

class School
  has_many :courses
end

class Course
  belongs_to :school
  has_many :enrollments
  has_many :students, :through => :enrollments
end

class Student
  has_many :enrollments
  has_many :courses, :through => :enrollments
end

class Enrollment
  belongs_to :course
  belongs_to :student
end    
2 голосов
/ 21 ноября 2011

Ваши модели должны выглядеть так:

class School < ActiveRecord::Base
  has_many :classes
  has_many :students, :through => :classes
end

class Class < ActiveRecord::Base
  belongs_to :school
  has_and_belongs_to_many :students
end

class Student < ActiveRecord::Base
  has_and_belongs_to_many :classes
end

Убедитесь, что в таблицах учеников и классов есть столбцы class_id и school_id соответственно.

Кроме того, Class - это зарезервированное слово в Rails , поэтому оно может вызвать проблемы (возможно, вам придется использовать другое имя)

1 голос
/ 21 ноября 2011

Хотя на первый взгляд кажется, что студенты должны принадлежать непосредственно к классу, класс на самом деле не является истинной заменой "has_and_belongs_to_many". Для этого я бы использовал «зачисление». (Обратите внимание, что с помощью rails 3.1 теперь вы можете делать вложенные: через вызовы.)

Вот немного более продвинутая реализация, чем у предыдущего комментатора:

class School << ActiveRecord::Base
  has_many :academic_classes
  has_many :enrollments, :through => :academic_classes
  has_many :students, :through => :enrollments, :uniq => true
end

class AcademicClass << ActiveRecord::Base
  belongs_to :school
  has_many :enrollments
end

class Enrollment << ActiveRecord::Base
  belongs_to :academic_class
  belongs_to :student
end

class Student << ActiveRecord::Base
  has_many :enrollments
  has_many :academic_classes, :through => :enrollments
  has_many :schools, :through => :academic_classes, :uniq => true
end
...