0

Rails 应用程序使用 Devise 进行用户身份验证。开始很简单,现在变得相当复杂。

有 3 种用户将登录到该站点:管理员、教师、家长。我有一个单独的设计User模型和User.role字符串。有一个Student模型(不登录)和一个Lesson模型。

这些是我需要的关系:

  • 课程属于一名学生
  • 学生有很多课
  • 学生有很多老师
  • 学生属于一位家长
  • 家长有很多学生
  • 老师有很多学生

网站的基本功能:教师登录并为学生上课。家长登录并查看他们孩子(学生)的所有课程。管理员登录并可以 CRUD 教师、家长和学生。

我的大部分工作都在工作,但是当我尝试实施“学生有很多老师”和“家长有很多学生”时,我被难住了。我最初的(不正确的)假设是学生只有一位老师,而父母在学校只有一个孩子。

因此,对于这些关系,使用字符串似乎是User.role不够的。

任何建议或一般概念将不胜感激。

4

3 回答 3

0

可以有多种方法来解决这个问题,我的理解是你已经解决了这么多,但是你让事情变得有点复杂。

您可以简单地拥有 1 个模型“用户”,其余的东西可以是多态的。您可以移动 User 中的常用属性,并将剩余的属性分离到相应的模型中。

如果看一下代码会好得多。

谢谢

于 2013-08-14T22:15:05.817 回答
0

我最终创建了第三个模型并使用has_many :through =>将所有内容链接在一起。我想保留一个 Devise 用户模型并使用 a.role进行授权。

我创建的第三个模型是Timeslot,本质上是教师和学生互动的地方。理想情况下,我会调用它,class或者session它们都是保留字。

# timeslot.rb
class Timeslot < ActiveRecord::Base
  belongs_to :user
  belongs_to :student
end

# user.rb
class User < ActiveRecord::Base
  ROLES = %w[admin teacher parent]
  has_many :timeslots
  has_many :students, through: :timeslots
end

# student.rb
class Student < ActiveRecord::Base
  has_many :lessons
  has_many :timeslots
  has_many :users, through: :timeslots
end

这允许具有角色的用户拥有多个teacher角色,students反之亦然。该Student模型有一parent_id列存储id具有角色的用户parent。那部分仍然有点笨拙,但现在可以正常工作。我敢肯定,如果应用程序必须扩展,我将不得不重构为更优雅的东西。

于 2013-08-18T09:45:45.223 回答
0

您是否只是在寻找连接表,即 has_and_belongs_to_many 关系?

http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

照我看来:

class Student
  belongs_to :parent
  has_and_belongs_to_many :teachers
end

class Parent
  has_many :students
end

class Teacher
  has_and_belongs_to_many :students
end
于 2013-08-14T21:27:55.593 回答