Самореферентная ассоциация

Это дополнительный вопрос из этого.

Это моя текущая установка, чтобы сделать отношения учитель-ученик.

Модель пользователя

  has_many :teacher_links, :foreign_key => :student_id, :dependent => :destroy, :class_name => "TeacherStudentLink"
  has_many :student_links, :foreign_key => :teacher_id, :dependent => :destroy, :class_name => "TeacherStudentLink"
  has_many :students, :through => :student_links
  has_many :teachers, :through => :teacher_links

Модель связи учителя и учащегося

class TeacherStudentLink < ActiveRecord::Base
  attr_accessible :user_id, :student_id, :teacher_id

  belongs_to :user
  belongs_to :student, :class_name => "User"
  belongs_to :teacher, :class_name => "User"
end

Мне это кажется неудобным, потому что таблица student_student_links имеет три столбца: пользователь, ученик, учитель. У пользователя может быть много учителей, и у него также может быть много учеников. Если у меня нет столбца учителя, и я просто притворяюсь, что «пользователь» является «учителем», все работает отлично. Есть ли способ решить эту проблему?


person Maximus S    schedule 22.01.2013    source источник
comment
Почему нельзя просто избавиться от столбца user_id и ассоциации :user в модели TeacherStudentLink?   -  person Sam Peacey    schedule 22.01.2013
comment
@cheeseweasel, сможете ли вы в этом случае использовать current_user.teachers?   -  person Maximus S    schedule 22.01.2013
comment
Да, конечно, у каждого пользователя будет ассоциация teachers и students.   -  person Sam Peacey    schedule 22.01.2013


Ответы (1)


что сыроворот сказал в комментариях, у вашей ссылки не должно быть user_id

class TeacherStudentLink < ActiveRecord::Base
  attr_accessible :student_id, :teacher_id

  belongs_to :student, :class_name => "User", :foreign_key => :student_id
  belongs_to :teacher, :class_name => "User", :foreign_key => :teacher_id
end
  • принадлежность_внешнему_ключу указывает внешний ключ в текущей таблице (ссылка)
  • has_many external_key указывает внешний ключ в другой таблице (ссылка)
person house9    schedule 22.01.2013
comment
Извините, если я туплю (это случается чаще, чем я хотел бы признать ;)), но не будет ли rails выводить внешний ключ из имени ассоциации? - person Sam Peacey; 22.01.2013
comment
в данном случае это возможно, так как ваша ассоциация называется student и это будет соответствовать fk student_id; часто, когда мне нужно указать class_name, у меня есть fk, который не совпадает, поэтому я привык использовать fk всякий раз, когда я использую class_name - person house9; 22.01.2013