你要找的这个查询:
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
你查询工作,谢谢!我意识到'dependent'选项,并且在适当的地方使用它。但是,我忘了这样做,所以我问了这个问题:) – sauronnikko 2014-09-02 21:31:44
不客气! ActiveRecord的'dependent'选项与我发布的方法略有不同。外键由数据库本身管理,并且在调用'student.delete'时也可以工作。 ActiveRecord方法只在调用'student.destroy'时才起作用;) – fivedigit 2014-09-02 21:33:48