ActiveRecord 中有两个delete_all
方法:
很多人都知道第一个 delete_all
,后一个却没注意,我就是这种,今天踩了这个坑,给大家分享一下,避免有人继续踩坑!
文档上已经写的很清楚了
不会走 callback 流程,不会查找对象,直接拼 SQL 删除
我想当然的以为与上面的delete_all
方法行为一致,确实是差不多,不会走 callback 流程,不会查找对象,直接拼 SQL。但是要注意,这里并不一定是删除,因为这里多了个dependent
参数,实际上这里的delete_all
会调用delete_or_nullify_all_records
,根据dependent
来确定是执行删除还是执行nullify。
比如我在Topic
model 上这么写:
has_many :views, class_name: :TopicView
然后我执行:
@topic.views.delete_all # 删除所有 views
实际上会执行与预期不符的 SQL:
UPDATE `topic_views` SET `topic_views`.`topic_id` = NULL WHERE `topic_views`.`topic_id` = 5927
这时我应该加上dependent
参数,这样才能符合删除所有views
的预期
@topic.views.delete_all(:delete_all) # 删除所有 views