2

当一个实体不与关联很多其他实体在同一时间,我还应该使用多对多关联吗?多对多协会是否仍适用于此?

例如,我了解作者与书籍的关系是多对多的,作者可以编写很多书籍,一本书可以由许多作者编写。这一直持续下去。

考虑这种情况。批次在特定时间有许多学生。如果一个学生失败了,他应该搬到下一个小班。换句话说,学生不能同时属于多个批次。在这种情况下,这是一个多对多的关联吗?

替代解决方案我想: 我还想着把两列学生表。 initial_batchcurrent_batch。由于规则,我可以通过检查当前批次和初始批次之间的差距来获取学生的批次历史记录。学生必须下降到下一个批次。此外,batch.students与轨道中的has_many关联存在。所以,我认为这不会是一个大问题。


按批,我的意思是一批学生在同一年被录取。

回答

1

我想你仍然想使用一个关联表(多对多关联),因为你可能想保留学生已经采取了哪些类的历史记录。

如果您希望它是多对一的并且让学生一次只能属于一个班级,那么您必须在学生表中添加一个class_id字段。这使您可以拨打student.class找到他们当前的班级,但由于该关系不存在,您将无法执行class.students。出于这个原因,我认为它应该是多对多的。

+0

这是一个很好的点,这是我也在想。我正在考虑学生的'initial_class'和'current_class'专栏,通过检查当前班和初始班之间的差距,我可以得到学生的班级历史记录,因为,学生必须下降到下一个直接班。另外,'class.students'存在'has_many'关联。不是吗? – Anwar

1

这是一个多对多关联

没错。

一个ActiveRecord协会是一个简单的方法可以让你创建两个连接的对象(ActiveRecordORM - 对象关系映射器)。

还记得,因为Ruby是object orientated,每个“模型”(类)都被视为一个对象,每当你想用数据填充它时就调用它。每个ActiveRecord的关联为每个对象通过方法在对象访问...

#app/models/student.rb 
class Student < ActiveRecord::Base 
    has_many :subjects #-> AR appends the "subjects" method to your Student object 
end 

简单地说,这意味着,即使你有许多不同的对象的功能,你不需要有方法填充数据。


如果您有以下...

#app/models/student.rb 
class Student < ActiveRecord::Base 
    has_and_belongs_to_many :subjects 
end 

#app/models/subject.rb # "class" is a reserved word 
class Subject < ActiveRecord::Base 
    has_and_belongs_to_many :students 
end 

这只是提供了什么是包含@students.subjects

功能/容量这个方法是由您来决定:

<% if @students.subjects.any? %> 
    <% @students.subjects.each do |subject| %> 
    ... 
    <% end %> 
<% end %> 
+0

谢谢你的时间。我实际上有很多模型,不只是一个连接表。该模型具有另一个存储失败计数的整数属性 – Anwar

+0

酷!是的,同样的逻辑仍然适用 –

+0

这带来了另一个问题,我如何获得最新批次的学生。但是,在另一个问题中可能会提到 – Anwar