Người chìm trong suy nghĩ không phải là người nhàn rỗi. Có sự lao động hữu hình, và có sự lao động vô hình. A man is not idle because he is absorbed in thought. There is a visible labor and there is an invisible labor.
Victor Hugo
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
