一、什么是383任务?
好牛逼的名字,有木有,哈哈,其实就是给chat和tag之间加个中间model,就像上面图片所说的,增加Chat::Tag模型
本来打算9.6~9.8号3天完成的,结果却是这样:
到9.25号才完成,花了20天才完成,7倍啊,我也是醉了。
二、分析一下原因吧?
总的来说,个人原因居多,自己水平不行啊,客观原因可能就是微信上问问题效率太慢,而且github上回复也慢呢
仔细分析下犯的错误吧。数了一下,至少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是序列化的参数,到时候h5页面可能会用到
最后,customers_tags_attributes应该是这样写:
[ customers_tags_attributes: %i[ id tag_id _destroy ] ]
如果不加的话,怎么传参数啊,id是customers_tags的id,_destroy可以删除本记录。
3、没有加validate
4、字母序
5、少了acts_as_paranoid(现在知道了这是软删除)
6、tag也要加上validate
当时没有认真想想tag添加的时候也要验证一下在未删除情况下唯一性、是否存在
7、这个忘记加dependent::restrict_with_error了(现在知道了,当tag被customer使用时是不能删除的,当出现有关联的tag被删除时,restrict_with_error会限制并报错)
8、字母序
9、本来抄系统里别的文件的代码,但是感觉enabled的默认值应该是true才对,于是将原来的false改成true,谁知道数据库的默认值都为false,由Ruby代码控制实际默认值的
10、lock_version是乐观锁,忘加了
11、不知道还能这么变(现在知道了,可以写成这样,代码更少,但是不知道为什么要要加deleted_at_and_customer_id_and_tag_id)
12、不知道Rails标准(现在知道了,如果要加索引,可以这样)
13、少了allow_destroy(加上这个就也能把关联的属性删除)
14、customer对应的是多个customers_tags,这里我直接写成了一个tag_id,明显不对嘛,在写这个的时候,还是20天前,那时候对这些关联啊懵懵懂懂的,现在基本都明白了
为嘛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的字段呢?当时完全是懵逼的状态。现在知道了customer不只有一个tag,所以应该是多维数组的形式来传参数
22、这也不对
23、当时完全不会做,剑爸5分钟写出来的,后来还是需要修改一下。
因为当时是通过chat/cusomer修改bag/customer,有且只有这样的逻辑,所以没加上chat/cusomter本身的修改。
另外,chat/customer和bag/customer的关联是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的多态类型,那么,可以这样定义:
belongs_to :chat
为什么polymorphic类型的关联不能直接用accepts_nested_attributes_for
25、学习了
26、系统会自动读取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、关联的Model如果加上touch: true,那么和这个Mode关联的另外一个model在更新时,这个model的updated_at也会被更新
2、inverse_of可以避免重复查询
3、accepts_nested_attributes_for可以更新、删除关联的属性
4、transaction可以直接写成一个代码块
@saved = model.transaction do
....
end
5、acts_as_paranoid 是软删除的gem
6、polymorphic多态让model更简洁
7、validate的相关用法
比如uniqueness、scope、existence、presence