2014-09-02 86 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