Что не так в нашем подходе к моделированию на Rails?

Если пользователи --> студенты // сотрудники (наследование одной таблицы), и они оба принадлежат организации --> школа // работа (наследование одной таблицы), как правильно написать ассоциацию? Я поместилorganization_id в класс User и написал, что принадлежит/имеет много в соответствующих подклассах, но когда я вызываю User.school, я получаю «ноль», хотя у него организация_id = 1.

пользователь.rb

class User < ActiveRecord::Base
  attr_accessible :email, :name, :password, :organization_id, :type
end

студент.рб

class Student < User
  belongs_to :school
end

сотрудник.рб

class Employee < User
  belongs_to :company
end

организация.rb

class Organization < ActiveRecord::Base
  attr_accessible :name
end

школа.рб

class School < Organization
  has_many :students
end

компания.rb

class Company < Organization
  has_many :employees
end

person im so confused    schedule 05.05.2013    source источник


Ответы (2)


Я настоятельно рекомендую вам не использовать однотабличное наследование. Какие преимущества вы получаете от этого? Студенты и сотрудники — это разные вещи, как и школы и компании. Это должны быть отдельные таблицы. Это сделает вашу жизнь намного, намного проще в долгосрочной перспективе. И если вы не используете наследование одной таблицы, эта проблема тоже исчезнет.

person Russell    schedule 05.05.2013

Класс User не определяет школьную ассоциацию и абсолютно ничего не знает о классе Student. Таким образом, вы не можете ожидать, что User.school будет работать. Вы можете ожидать, что Student.school будет работать, поскольку это то, что определяет ваш код.

То, что STI формирует перспективу столбцов, просто добавляет столбец строки типа, который показывает, к какому подтипу модели относится запись.

Вы также можете переосмыслить то, как вы моделируете свои данные. Студент принадлежит к школе, но пользователь также может принадлежать к компании или, может быть, к двум школам.

person Andreyy    schedule 05.05.2013