我有以下型号:
class Grade
belongs_to :student
end
class Student
has_many :grades
end
如何找出已删除学生的成绩?换句话说,我想做一个基本上返回我在下一行代码中所做的事情的查询
Grade.all - Grade.joins(:student)
有可能吗?谢谢!
答案 0 :(得分: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