确定在Rails回调中是否添加/删除了子项

时间:2011-01-06 20:23:14

标签: ruby-on-rails-3 has-and-belongs-to-many

场景:

我有habtm关系,想确定是否添加或删除了一个方向的孩子。我正在尝试使用回调,但发现我没有对孩子们进行更改的记录。有什么类似course.students.changed?


使用:

  • Rails 3.0.3
  • Ruby 1.9.2p0

表格:

学生 - id,first_name,last_name
课程 - 身份证,姓名,地点
courses_students - course_id,student_id


型号:

class Course
  # Callbacks
  before_save :student_maintenance

  # Relationships
  has_and_belongs_to_many :students

  protected
  def student_maintenance
    # I want to do something like
    students.changed?
      students.changes.each do |student|
        if marked_for_deletion
          # do something
        elsif marked_for_addition
          # do something else
        end
      end
    end
  end
end

class Student
  # Relationships
  has_and_belongs_to_many :courses
end

2 个答案:

答案 0 :(得分:2)

如果您想要在课程中添加或删除学生时进行捕获,为什么不使用连接表的课程* courses_students *?由于这是实际创建或销毁条目的地方,因此可以在那里轻松使用after_create / after_destroy回调。

答案 1 :(得分:0)

与polarblau的答案类似 - 但是我希望能有更多的解释:

在文本,UML术语中,关系可能是这样的:

Course ------*-> Student

阅读:课程有0到多名学生

您可以随意添加和删除该协会的学生。

但是,您有兴趣了解关联的更多信息,即学生在课程中添加或删除的时间。关于关联的这个“额外”信息导致发现你需要另一个类,a.k.a。“关联类。”

所以现在你要在你现有的类之间插入那个类,冒昧地把它称为​​“注册”:

Course ------*->Registration------1->Student

阅读:课程有0到多个注册。每次注册必须只有1名学生。

注册类可能如下所示:

+--------------+
| Registration |
+--------------|
| student      |
| time_added   |
| time_dropped |
+--------------+

因此,您可以轻松获取当前学生的课程列表(time_dropped为零)。或者已删除的学生列表(time_dropped不是零)。