【问题标题】:Is many-to-many association still apply here?多对多关联在这里仍然适用吗?
【发布时间】:2016-01-16 15:18:15
【问题描述】:

当一个实体不与许多其他实体同时关联时,我还应该使用多对多关联吗?

例如,我理解作者与书籍的关系是多对多的,一个作者可以写很多本书,一本书可以由多个作者写。这一直有效。

考虑这种情况。 A Batch 在某个特定时间有许多学生。如果一个学生不及格,他应该转到下一个初级班。换句话说,一个学生不能同时属于多个批次。在这种情况下,这是多对多关联吗?

我认为的替代解决方案: 我正在考虑在学生表中放置两列。 initial_batchcurrent_batch。我可以通过检查当前批次和初始批次之间的差距来获取学生的批次历史记录,因为 学生必须降到下一个立即批次。此外,batch.students 与 rails 中的 has_many 关联存在。所以,我认为这没什么大不了的。


所谓批次,是指同一年被录取的一批学生。

【问题讨论】:

    标签: ruby-on-rails entity-framework database-design many-to-many


    【解决方案1】:

    我认为您仍然希望使用关联表(多对多关联),因为您可能希望保留学生上过哪些课程的历史记录。

    如果您希望它是多对一的并且一次让一个学生属于一个班级,您必须在您的学生表中添加一个class_id 字段。这允许您调用student.class 来查找他们当前的课程,但您将无法执行class.students,因为该关系不存在。因此,我认为应该是多对多。

    【讨论】:

    • 这是一个很好的观点,我也在想。我正在考虑学生中的initial_classcurrent_class 列,我可以通过检查当前班级和初始班级之间的差距来获取学生的班级历史,因为,学生必须降到下一个直接班级。此外,class.studentshas_many 关联存在。不是吗?
    【解决方案2】:

    这是多对多关联吗

    是的。

    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 %>
    

    【讨论】:

    • 感谢您的宝贵时间。我实际上有很多模型,而不仅仅是一个连接表。该模型还有另一个整数属性,用于存储失败计数
    • 酷!是的,同样的逻辑仍然适用
    • 这就带来了另一个问题,我如何获取最新批次的学生。但是,这可能会在另一个问题中提出
    • 要给出一个具体的答案,我需要知道你是如何分开批次的
    • first_column 是batch_id,第二个是student_id,第三个是drop_count。 [batch_id, drop_count] 上的唯一索引
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多