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

Това е последващ въпрос от това.

Това е сегашната ми настройка да създавам връзка учител-ученик.

Потребителски модел

  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

Модел TeacherStudentLink

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

Струва ми се неудобно, защото таблицата teacher_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)


това, което каза cheeseweasel в коментарите, вашата връзка не трябва да има 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