Как работать с мастер-деталями с помощью STI - PullRequest
0 голосов
/ 24 марта 2012

Если роль - таблица ИППП:

class Role< ActiveRecord::Base
   self.inheritance_column= :role_type 
end

А ученик и советник наследуют роль:

class Student< Role
end

class Counselor< Role
end

А StudentDetail хранит дополнительную информацию об одном студенте:

class StudentDetail< ActiveRecord::Base
    belongs_to :student
end

И пользователь может быть и студентом, и консультантом:

class User< ActiveRecord::Base
    has_many :roles
    has_one :student
    has_one :counselor
end

А число - это столбец в StudentDetail, И role_id - это столбец в StudentDetail

Можно ли заставить работать следующий синтаксис?

User.first.student.number

Значение: «если в таблице ролей есть один студент с user_id == User.first.id, то User.first.student не имеет значение null и если StudentDetail имеет role_id == Student.where (" user_id =? ", User.first .id) .first.id, заставьте "student" действовать как запись StudentDetail и получить поле номера. "

1 Ответ

1 голос
/ 24 марта 2012

У вас будет перенаправление User.first.student.student_detail.number из коробки. Я не думаю, что это очень больно: -)

Я вижу два варианта (как минимум), как идти дальше:

  • Определите методы для StudentDetail методов в Student:

    def number
      self.student_detail ? self.student_detail.number : nil
    end
    
  • Используйте метод, отсутствующий, чтобы сделать это автоматически:

    def method_missing(name, *args, &block)
      self.student_detail ? self.student_detail.send(name, *args, &block) : nil
    end
    
...