Rails Множественные отношения и STI

Я настраиваю учетные записи пользователей, и у пользователей разные роли. Я использую STI, и мои модели выглядят так:

class User < ActiveRecord::Base

end

Class Teacher < User

end

Class Student < User

end

Как я могу настроить отношения «многие ко многим» между учениками и учителями, чтобы я мог делать такие звонки, как,

Teacher.students or Student.teachers ??

Чай


person beesasoh    schedule 27.03.2014    source источник
comment
вместо использования STI вам следует переосмыслить свой макет и, возможно, выбрать композицию, а не наследование. например модель User, а затем Teacher#belongs_to :user и Student#belongs_to :user   -  person Marian Theisen    schedule 27.03.2014
comment
Спасибо, я думал об этом, хотя STI имел много семантического значения. рассмотрит это   -  person beesasoh    schedule 27.03.2014
comment
возможный дубликат Как реализовать наследование Active Record в Ruby на Рельсы?   -  person Uelb    schedule 27.03.2014
comment
stackoverflow.com/questions/1598936/   -  person Uelb    schedule 27.03.2014
comment
@Oxynum Это не дубликат, этот вопрос описывает, как настроить отношения STI. Я сделал это, моя проблема в том, что я не могу установить отношения между подклассами. В этом вопросе это будут отношения вроде Firm.clients.   -  person beesasoh    schedule 27.03.2014


Ответы (1)


Я откладываю вопрос «использовать или не использовать ИППП?» вопрос и предполагая, что у вас есть причина.

Конечно, вам понадобится столбец id, например, Teacher_id.

Я собираюсь включить в свой пример явные имена классов, потому что знаю, что это работает, но, вероятно, они мне нужны только потому, что мои модели имеют пространство имен, поэтому они, вероятно, излишни для вас.

class Teacher < User
  has_many :students, :class_name => 'Student', :foreign_key => 'teacher_id'
end

class Student < User
  belongs_to :teacher, :class_name => 'Teacher', :foreign_key => 'teacher_id'
end

И это должно сделать это --- черт. Это сделало бы это, за исключением того, что я пропустил многие ко многим.

Так что я бы попробовал HABTM, но, признаюсь, я никогда не делал этого с STI.

Начните с этой миграции, чтобы создать таблицу соединений.

class CreateStudentsAndTeachers < ActiveRecord::Migration
  def change
    create_table :students_teachers do |t|
      t.belongs_to :student
      t.belongs_to :teacher
    end
  end
end

И тогда это должно работать (и опять же, вам может не понадобиться указанное имя класса)

class Teacher < User
  has_and_belongs_to_many :students, :class_name => 'Student'
end

class Student < User
  has_and_belongs_to_many :teachers, :class_name => 'Teacher'
end
person elc    schedule 27.03.2014
comment
Упс, я пропустил часть «многие ко многим». Вы уже пробовали HABTM? Я ожидаю, что это сработает, основываясь на гладком плавании, которое у меня было с другими эффектами STI, но я не верю, что действительно проверял это. - person elc; 27.03.2014
comment
проблема в том, что у меня нет id_учителя, а есть только id_пользователя - person beesasoh; 28.03.2014
comment
user_id — это идентификатор записи. Если вы хотите, чтобы в STI выполнялось самостоятельное соединение «один ко многим», вам также понадобится столбец «внешний» идентификатор (например, Teacher_id). Если вам нужна функция «многие ко многим» через HABTM, вам не понадобится еще один столбец, но вам понадобится таблица соединений. - person elc; 04.04.2014