切換到新的分支進行開發(fā)
git checkout -b sixth/delete_history
案例進行
-
添加路由
-
添加刪除動作
-
在視圖頁面添加刪除歷史記錄的按鈕
點擊清空歷史記錄后勃刨,歷史記錄全部清空了幔嗦,如下:
查看控制臺信息,發(fā)現(xiàn)sql查詢結(jié)果如下游岳,造成冗余查詢政敢,302代表臨時性跳轉(zhuǎn)(這個日后補充相關(guān)知識):
修改刪除動作
可以看到修改后的sql語句只有一條
如上還是錯誤的,不安全的寫法胚迫。因為我們應(yīng)該避免使用delete喷户。我們要修改成destroy方法才行,不然無法觸發(fā)我們在模型文件里面的回調(diào)函數(shù)访锻。
- Delete: 在[數(shù)據(jù)庫]中直接刪除記錄
-
Destroy:先在model中找到該記錄褪尝,然后在刪除闹获,這意味著會調(diào)用callback,比如”before destroy“
所以我們應(yīng)該修改為:
控制臺信息:
上面我們發(fā)現(xiàn)使用destroy_all執(zhí)行了多條sql河哑,這是因為我們每刪一條記錄理論上都要經(jīng)過一次模型層的驗證和觸發(fā)回調(diào)避诽,所以不是一條sql語句可以實現(xiàn)的。查看destroy_all的源碼璃谨,我們可以看到該接口的實現(xiàn)本身就是each遍歷調(diào)用destroy方法沙庐,所以與each出來一個個destroy的結(jié)果是一樣的,都會有多條sql語句睬罗。
而我們查看delete_all的源碼轨功,可以發(fā)現(xiàn)與destroy_all不同旭斥,沒有each逐漸遍歷執(zhí)行delete容达,這也就是delete_all只會執(zhí)行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