Khi thao tác với active record trong rails, các bạn có thể sử dụng destroy hoặc delete để xóa một đối tượng nào đó. Nhưng destroy sẽ gọi một mớ các tiến trình validate, gọi callback, ... còn delete chỉ đơn thuần gọi một câu lệnh sql xóa dữ liệu trong DB mà thôi.

Sau đây mình xin giải thích cụ thể:

Xét ví dụ có Post có nhiều Comments và Comment thuộc về một Post.

#model Post
class Post < ApplicationRecord
   has_many :comments, dependent: destroy

   before_destroy :log_before_destroy
   after_destroy :log_after_destroy

   def log_before_destroy
      logger.info = "log before destory post"
   end

   def log_after_destroy
      logger.info = "log after destroy post"
   end
end


#model Comment
class Comment < ApplicationRecord
   belongs_to :post
   
   before_destroy :log_before_destroy
   after_destroy :log_after_destroy

   def log_before_destroy
      logger.info = "log before destory comment"
   end

   def log_after_destroy
      logger.info = "log after destroy comment"
   end
end

 

 "dependent: destroy" được khai báo trong model nghĩa là gì?

Nghĩa là khi object của model đó mà bị destroy thì các object liên kết với nó cũng bị destroy theo.

Trong ví dụ trên, khi một post bị destroy thì các comment của post đó cũng bị destroy.

 

1. Delete

Khi gọi delete một active record thì chỉ đơn thuần gọi câu lệnh sql trong DB, mọi thứ như là các hàm before_destroy, after_destroy và gọi callback destroy các dependent sẽ không được thực thi.

p = Post.first
p.delete

# DELETE FROM "posts" where id = 1

 

2. Destroy

Khi gọi destroy thì các hàm before, after_destroy và callback ở các dependent sẽ được thực thi theo thứ tự sau:

 - Gọi hàm before_destroy nếu được khai báo

 - Xóa object

 - Nếu bạn xét "dependent: delete" thì các object liên kết tới object này gọi hàm delete và xóa chỉ bằng câu lệnh sql. Còn nếu bạn xét "dependent: destroy" thì các object liên kết tới object này sẽ lặp lại các bước từ gọi hàm before_destroy, xóa object,... với chính nó.

 - Gọi hàm after_destroy nếu được khai báo.

 

Link tham khảo:

 http://stackoverflow.com/questions/12458662/dependent-delete-on-belongs-to-doesnt-delete-owner-object