【问题标题】:Rails Association: Teacher Student ClassesRails 协会:教师学生班
【发布时间】:2014-11-22 11:49:22
【问题描述】:

我仍在学习如何使用 Rails 获得创意,并且可以使用一些关于以下 Rails 协会最佳实践的指导:

我有三个模型,教师、学生和班级。教师可以教任意数量的班级,学生可以加入任意数量的班级,一个班级只能由一名教师授课,但可以有1-5名学生。

我的第一个假设是使用以下内容:

类: 属于老师 has_many 学生

教师: has_many:学生通过 => 课程

学生: has_many: 教师通过 => 课程

我不知道这是否合适,我已经看到了加入表格的建议。任何指导将不胜感激 !

更新:鉴于以下有用用户的反馈,我建议以下解决方案。有人可以验证一下吗?因为一个学生可以有多个班级并属于一个班级,反之亦然,我需要两个联接表

class ClassRoomEnrollment < ActiveRecord::Base
 belongs_to :students
 belongs_to :classrooms
end

class ClassRoom < ActiveRecord::Base
 belongs_to :teacher
 has_many :students through: classroomenrollment 

end

class Teacher < ActiveRecord::Base
 has_many :students :through => :classrooms
end

class Student < ActiveRecord::Base
 has_many :teachers :through => :classrooms
 has_many :classrooms through: classroomenrollment 
end

【问题讨论】:

  • 你错过了Student: has_many :classes。基本上学生和班级之间的关系是HABTM。其他一切看起来都很好。
  • 谢谢@Nitish。我还需要添加 Teacher has_many :classes 吗?
  • 对于学生来说,has_many: classes 是否通过我添加的 :classes 关系替换了 has_many 教师?
  • 是的,您还需要Teacher has_many :classrooms。对于学生来说,你目前拥有的一切都很好。

标签: ruby-on-rails


【解决方案1】:

Class不是个好名字,ClassRoom更好

class ClassRoom < ActiveRecord::Base
  belongs_to :teacher
  belongs_to :student # if I have well understand, this is the right association

  #some validations rules
  validates :<fieldname>, :<rule> => <value>, ...

  #callback like :before_save or :after_save, ....
end

class Teacher < ActiveRecord::Base
  has_many :students :through => :classrooms, :depend => :destroy

  #some validations rules
  validates :<fieldname>, :<rule> => <value>, ...

  #callback like :before_save or :after_save, ....
end

class Student < ActiveRecord::Base
  has_many :teachers :through => :classrooms, :depend => :destroy

  #some validations rules
  validates :<fieldname>, :<rule> => <value>, ...

  #callback like :before_save or :after_save, ....
end

自动创建通过表的关联(has_many、has_one、belongs_to)连接。您可以访问一位老师的所有学生,例如

teacher.classrooms.first.students e.g.

希望对你有所帮助。

【讨论】:

  • 谢谢@fellons!两个问题。首先,为什么 ClassRoom 属于一个学生而不属于 has_many 个学生?同样在你上面的例子中,我可以调用 student.classrooms.first.teacher (基本上与上述相反)最后,我需要添加任何外国索引吗?
  • 实际上,重新考虑@fellons,我想我需要在教室和学生之间建立一个连接表。在上述方法中,无法访问 teacher.classroom.first.students 我想我还需要为教室和学生创建一个 has_many :through 关系。查看我的更新
  • 要实现关联:通过教师和课堂之间以及学生和课堂之间的关联,必须有一个班级(Classroom)将学生ID和教师ID分组(参见guides.rubyonrails.org/association_basics.html第4.2章)。不需要创建索引,因为它在 ID 字段之间的连接已经被索引。连接是双向的(通过课堂课堂):student.classrooms.first.teacher(或简称 student.teacher)或teacher.students。
  • 我明白,但如果 Classroom 有任何其他字段(即房间号、时间等),最好像我在我编辑的评论中所做的那样将它作为一个单独的类。
  • 要选择特定教室的学生或教师,您可以使用两种方式:(1)创建一个classe ClassName has_many :classrooms 并在class Classroom(2)中添加belongs_to :classname(即使它创建数据冗余:不推荐)添加一个字段 :classname 到班级 Classroom 并每次使用班级名称填充它。通过这种方式,您可以使用教室.where (:classname => ') 提取给定班级名称的学生和/或教师。本文档可能会阐明您对关联的看法:guides.rubyonrails.org/association_basics.html.
猜你喜欢
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多