我正在尝试使用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 :(得分:0)
看起来您需要将User的“角色”部分分离为单独的对象,然后允许用户拥有多个角色。有时这些被称为“配置文件”,因为它们实际上是指呈现用户的方式。
然后,您可以使用用户模型作为代理来访问您要测试配置文件存在的这些内容:
if (user.teacher)
# ...
else
flash[:notice] = "You must be a teacher to perform this operation."
end