(6)添加删除历史记录功能,delete和destroy

切换到新的分支进行开发

git checkout -b sixth/delete_history

案例进行

  • 添加路由


    image.png
  • 添加删除动作


    image.png
  • 在视图页面添加删除历史记录的按钮


点击清空历史记录后,历史记录全部清空了,如下:


查看控制台信息,发现sql查询结果如下,造成冗余查询,302代表临时性跳转(这个日后补充相关知识):


修改删除动作


可以看到修改后的sql语句只有一条


如上还是错误的,不安全的写法。因为我们应该避免使用delete。我们要修改成destroy方法才行,不然无法触发我们在模型文件里面的回调函数。

  • Delete: 在[数据库]中直接删除记录
  • Destroy:先在model中找到该记录,然后在删除,这意味着会调用callback,比如”before destroy“
    所以我们应该修改为:


控制台信息:


上面我们发现使用destroy_all执行了多条sql,这是因为我们每删一条记录理论上都要经过一次模型层的验证和触发回调,所以不是一条sql语句可以实现的。查看destroy_all的源码,我们可以看到该接口的实现本身就是each遍历调用destroy方法,所以与each出来一个个destroy的结果是一样的,都会有多条sql语句。


而我们查看delete_all的源码,可以发现与destroy_all不同,没有each逐渐遍历执行delete,这也就是delete_all只会执行1条sql的原因。

把修改提交到远程仓库

git add .
git commit -m "添加删除历史记录功能"
git push -u https://github.com/xiaohuacc/active_record.git sixth/delete_history

合并到主分支

git checkout master
git merge sixth/delete_history
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容