场景:
我有habtm关系,想确定是否添加或删除了一个方向的孩子。我正在尝试使用回调,但发现我没有对孩子们进行更改的记录。有什么类似course.students.changed?
使用:
表格:
学生 - 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
答案 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不是零)。