Rails关联 - 如何为不同类型的用户设置关联?

时间:2012-01-07 17:29:54

标签: ruby-on-rails ruby-on-rails-3.1 rails-models

我正在创建一个由学校,课程,学生和教师组成的网络应用程序。

学校可以开设很多课程,课程有一位老师和很多学生。

我遇到的问题是,单个用户可能是一门课程的教师,而是另一门课程的学生(甚至是不同学校课程中的学生或教师)。我不想为教师创建模型,也不想为学生创建单独的模型,因为我想在一个地方跟踪所有用户。有一个注册表,列出了哪些用户在课程中注册为学生。

我想做以下事情:

class School < ActiveRecord::Base
  has_many :courses
  has_many :students :through enrollments
  has_many :teachers :through courses
end

class Course < ActiveRecord::Base
  has_one :teacher
  belongs_to :school
  has_many :students :through enrollments
end

class User < ActiveRecord::Base
  has_many :courses
  has_many :schools
end

但是如果我只有一个用户表而不是两个单独的学生和教师表,那么这将不起作用。

相反,我必须做类似

的事情
class School < ActiveRecord::Base
  has_many :users [that are teachers]
  has_many :users :through enrollments [that are students]
end

如何设置我的模型和关联以使其工作?

感谢。

3 个答案:

答案 0 :(得分:3)

使用继承。

教师和学生继承自用户模型。您可以咨询http://api.rubyonrails.org/classes/ActiveRecord/Base.html以获取更多信息。请务必在用户表中创建“类型”列或等效项。

class User < ActiveRecord::Base
end

class Student < User
end

class Teacher < User
end

Rails将单独处理它们,但它们仍将存在于用户表中。如果您需要进一步的帮助,请告诉我

答案 1 :(得分:0)

我可能错过了一些内容,但如果您将class_name添加到与“用户”的关系中,它应该会有效:

class School < ActiveRecord::Base
  has_many :courses
  has_many :students :through enrollments, :class_name => "User"
  has_many :teachers :through courses, :class_name => "User"
end

class Course < ActiveRecord::Base
  has_one :teacher, :class_name => "User"
  belongs_to :school
  has_many :students :through enrollments, , :class_name => "User"
end

class User < ActiveRecord::Base
  has_many :courses
  has_many :schools
end

答案 2 :(得分:0)

teachers_id添加courses列,并使用belongs_to代替has_one。然后添加class_name选项。

class School < ActiveRecord::Base
  has_many :courses
  has_many :students :through enrollments
  has_many :teachers :through courses
end

class Course < ActiveRecord::Base
  belongs_to :teacher, :class_name => 'User'
  belongs_to :school
  has_many :students :through enrollments
end

class User < ActiveRecord::Base
  has_many :courses
  has_many :schools, :through enrollments
  has_many :teachers, :through :courses
end