2014-09-02 87 views
0

我有以下型号:轨道4:找哪家加入对应记录的记录已被删除

class Grade 
    belongs_to :student 
end 

class Student 
    has_many :grades 
end 

我怎样才能找出哪些年级的学生都已经被删除了?换句话说,我想做一个查询,基本上返回我在下一行代码

Grade.all - Grade.joins(:student) 

这可能吗?谢谢!

回答

0

你要找的这个查询:

Grade.includes(:student).references(:student).where('students.id IS NULL') 

这似乎从一个数据完整性的角度非常麻烦,虽然。当学生被删除时,grades.student_id应该被取消,或者应该完全删除。

这可以通过在数据库中设置外键约束来轻松管理。这是一个漂亮的宝石是foreigner。外键也将成为upcoming Rails 4.2 release的一部分。

如果成绩仍应该继续即使学生被删除的存在,你可以设置这台grades.student_id为学生的外键NULL

# Foreigner 
add_foreign_key :grades, :students, dependent: :nullify 

# Rails 4.2 
add_foreign_key :grades, :students, on_delete: :nullify 

你不需要做任何特殊的这个,数据库将负责清理。然后,如果您想查找的成绩没有学生,你可以简单地运行此查询:

Grade.where(student: nil) 

如果成绩应该被删除时,被删除的学生,你可以添加这个外键:

# Foreigner 
add_foreign_key :grades, :students, dependent: :delete 

# Rails 4.2 
add_foreign_key :grades, :students, on_delete: :cascade 
+0

你查询工作,谢谢!我意识到'dependent'选项,并且在适当的地方使用它。但是,我忘了这样做,所以我问了这个问题:) – sauronnikko 2014-09-02 21:31:44

+0

不客气! ActiveRecord的'dependent'选项与我发布的方法略有不同。外键由数据库本身管理,并且在调用'student.delete'时也可以工作。 ActiveRecord方法只在调用'student.destroy'时才起作用;) – fivedigit 2014-09-02 21:33:48