What is the difference between delete and destroy?
delete與destroy差異在哪?
之前在談到Active Record時,有特別說明,對於依照Active Record設計模式的Model,也就是Rails MVC中的Model有內建一些CRUD的方法來讓我們操作其物件,而物件會對應到資料表的資料。
而CRUD中的D也就是刪除方法有兩種,一種是delete,另一種是destroy,我們就來看看兩者的差異為何?
delete(id_or_array)
需要傳入參數id
或陣列
會直接使用SQL的DELETE語法刪除資料(以primary key對應到id
參數的那一筆),過程中並沒有牽扯到Active Record物件的過程,所以物件的callback都不會被執行,包括與其他model的:dependent
關係。
雖然是比destroy方法來的更快,但有可能因此跳過了某些可能寫在程式中必要的callback或是關聯性,所以使用上要特別小心。
# 刪除一行資料
Todo.delete(1)
# 刪除多行資料
Todo.delete([2,3,4])
destroy(id)
在物件被刪除前,會先需要物件對應的id,物件會先被實體化後,然後呼叫destroy方法,所以刪除過程會執行所有所需要的callback。
這個方法是比delete效率低了點,但會執行所有的callback及需要的動作。
會需要先藉由id
找到那個物件(或多個物件),之後實體化後在呼叫destroy。
# 刪除一個物件
Todo.destroy(1)
# 刪除多個物件
todos = [1,2,3]
Todo.destroy(todos)
與destroy
相關最常見的callback就是與其他model的關聯性。舉下面例子為例,當Article
這個model的某一個實體article
刪除時,屬於這文章的comments
也跟著被刪除。
class Article << ApplicationController
has_many :comments, dependent: :destroy
end
delete與destroy的差別在於delete方法不會執行callback方法,雖然效能比較好,但使用上要小心會不會跳過某些callback或關聯性的資料沒有刪除到。
1.Rubyguide-ActiveRecord Callbacks
2.53 Ruby on Rails Interview Questions and Answers