STI: у пользователя несколько идентификаторов дочерних классов (я хочу, чтобы у пользователя был только один идентификатор дочернего класса) - PullRequest
0 голосов
/ 21 марта 2012

Я пытаюсь использовать STI, потому что я хочу использовать страницу единого входа для устройства. Я хочу присвоить teacher_id или student_id для user, но оказалось, что все user имеют оба. Как я могу решить эту проблему? Ниже приведены модели и миграция.

class User < ActiveRecord::Base
  ...
  DEFAULT_ROLE = 'Student'
  after_create :set_role
  attr_accessible ..., :role
  has_one :role
  ...
  private
    def set_role
      self.role ||= Role.find_by_name(DEFAULT_ROLE)
    end
  ...
end


class Student < User
  has_many :bookings
end

Class Teacher < User
  has_many :bookings
end

class Role < ActiveRecord::Base
  validates :name, :presence => true
  belongs_to :user
end

Class Booking < ActiveRecord::Base
  attr_accessible :student_id, :teacher_id
  belongs_to :teacher, :class_name => 'Teacher'
  belongs_to :student, :class_name => 'Student'
  ...

class CreateBookings < ActiveRecord::Migration
  def change
    create_table :bookings do |t|
      t.integer :student_id
      t.integer :teacher_id
      t.date :booking_date
      t.time :booking_time

      t.timestamps
    end
  end
end

1 Ответ

0 голосов
/ 21 марта 2012

Похоже, вам нужно разделить «роль» пользователя в отдельный объект, а затем разрешить пользователям иметь несколько ролей.Иногда их называют «профилями», поскольку они действительно относятся к способу представления пользователя.

Затем вы можете использовать модель пользователя в качестве прокси для доступа к этим вещам, где вы будете проверять наличие профиля:

if (user.teacher)
  # ...
else
  flash[:notice] = "You must be a teacher to perform this operation."
end
...