Rails 4:获取加入关联记录的记录已被删除

时间:2014-09-02 18:10:19

标签: activerecord ruby-on-rails-4

我有以下型号:

class Grade
  belongs_to :student
end

class Student
  has_many :grades
end

如何找出已删除学生的成绩?换句话说,我想做一个基本上返回我在下一行代码中所做的事情的查询

Grade.all - Grade.joins(:student)

有可能吗?谢谢!

1 个答案:

答案 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