你要找的這個查詢:
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