一、什么是383任務矩欠?
好牛逼的名字财剖,有木有,哈哈癌淮,其實就是給chat和tag之間加個中間model躺坟,就像上面圖片所說的,增加Chat::Tag模型
本來打算9.6~9.8號3天完成的乳蓄,結果卻是這樣:
到9.25號才完成咪橙,花了20天才完成,7倍啊栓袖,我也是醉了匣摘。
二、分析一下原因吧裹刮?
總的來說音榜,個人原因居多,自己水平不行啊捧弃,客觀原因可能就是微信上問問題效率太慢赠叼,而且github上回復也慢呢
仔細分析下犯的錯誤吧。數(shù)了一下违霞,至少30個以上的錯誤嘴办,這里選擇31個比較有代表性的。
1买鸽、不小心把本地的Gemfile.lock給上傳了
2涧郊、chat/customer.rb忘記加accepts_nested_attributes_for、json接口和customers_tags_attributes屬性
首先眼五,accepts_nested_attributes_for :customers_tags是為了讓customers_tags的屬性也能和customers屬性一樣被更新妆艘、刪除
其次,json_options是序列化的參數(shù)看幼,到時候h5頁面可能會用到
最后批旺,customers_tags_attributes應該是這樣寫:
[ customers_tags_attributes: %i[ id tag_id _destroy ] ]
如果不加的話,怎么傳參數(shù)啊诵姜,id是customers_tags的id汽煮,_destroy可以刪除本記錄。
3、沒有加validate
4暇赤、字母序
5心例、少了acts_as_paranoid(現(xiàn)在知道了這是軟刪除)
6、tag也要加上validate
當時沒有認真想想tag添加的時候也要驗證一下在未刪除情況下唯一性翎卓、是否存在
7契邀、這個忘記加dependent::restrict_with_error了(現(xiàn)在知道了摆寄,當tag被customer使用時是不能刪除的失暴,當出現(xiàn)有關聯(lián)的tag被刪除時,restrict_with_error會限制并報錯)
8微饥、字母序
9逗扒、本來抄系統(tǒng)里別的文件的代碼,但是感覺enabled的默認值應該是true才對欠橘,于是將原來的false改成true矩肩,誰知道數(shù)據(jù)庫的默認值都為false,由Ruby代碼控制實際默認值的
10肃续、lock_version是樂觀鎖黍檩,忘加了
11、不知道還能這么變(現(xiàn)在知道了始锚,可以寫成這樣刽酱,代碼更少,但是不知道為什么要要加deleted_at_and_customer_id_and_tag_id)
12瞧捌、不知道Rails標準(現(xiàn)在知道了棵里,如果要加索引,可以這樣)
13姐呐、少了allow_destroy(加上這個就也能把關聯(lián)的屬性刪除)
14殿怜、customer對應的是多個customers_tags,這里我直接寫成了一個tag_id曙砂,明顯不對嘛头谜,在寫這個的時候,還是20天前鸠澈,那時候?qū)@些關聯(lián)啊懵懵懂懂的柱告,現(xiàn)在基本都明白了
為嘛json_options不用寫
15、寫多了一行款侵,太粗心了
16末荐、這個也是對acts_as_paranoid不知道,所以犯了這么個錯誤
17新锈、要加上validate
18甲脏、又是字母序
19、 又缺少acts_as_paranoid
![image.png](http://upload-im ages.jianshu.io/upload_images/1866870-eb68997de2bf304c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)_
21、這樣肯定不對啊块请,customer的view怎么會有tag_id的字段呢娜氏?當時完全是懵逼的狀態(tài)。現(xiàn)在知道了customer不只有一個tag墩新,所以應該是多維數(shù)組的形式來傳參數(shù)
22贸弥、這也不對
23、當時完全不會做海渊,劍爸5分鐘寫出來的绵疲,后來還是需要修改一下。
因為當時是通過chat/cusomer修改bag/customer臣疑,有且只有這樣的邏輯盔憨,所以沒加上chat/cusomter本身的修改。
另外讯沈,chat/customer和bag/customer的關聯(lián)是polymorphic的郁岩,如果用accepts_nested_attributes_for 需要手動指定type,前端就比較復雜缺狠。
后來改成這樣了
@customer = customers.find_by(user_name: params[:id]) || customers.find(params[:id])
@saved = model.transaction do
@customer.attributes = param.permit(model.admin_fields)
@customer.customizable&.add_remark!(param[:remark_name])
@customer.save!
end
24问慎、這句話啥意思
有很多疑問,比如什么是customizable挤茄,什么是polymorphic類型
customizable是customer的多態(tài)類型如叼,那么,可以這樣定義:
belongs_to :chat
為什么polymorphic類型的關聯(lián)不能直接用accepts_nested_attributes_for
25驮樊、學習了
26薇正、系統(tǒng)會自動讀取chat/customers_tag的表名
27、學習了
28囚衔、如果換成t.格式的話就要寫在creat_table里面
29挖腰、為什么要加上chatroom.find(user_name:params[:id])呢?
user_name是微信用戶登錄的識別碼
30练湿、method::get 可以省略 這是因為默認就是get方式
31猴仑、讓我用transaction寫,但是不會寫啊肥哎,后來劍爸寫的
第一次做這么完整一點的任務辽俗,包含三個model,多對多的關系篡诽。
收獲:讓我了解了很多Rails的功能和特性
1崖飘、關聯(lián)的Model如果加上touch: true,那么和這個Mode關聯(lián)的另外一個model在更新時杈女,這個model的updated_at也會被更新
2朱浴、inverse_of可以避免重復查詢
3吊圾、accepts_nested_attributes_for可以更新、刪除關聯(lián)的屬性
4翰蠢、transaction可以直接寫成一個代碼塊
@saved = model.transaction do
....
end
5项乒、acts_as_paranoid 是軟刪除的gem
6、polymorphic多態(tài)讓model更簡潔
7梁沧、validate的相關用法
比如uniqueness檀何、scope、existence廷支、presence