美文网首页
383任务复盘

383任务复盘

作者: 柳辉 | 来源:发表于2017-09-29 17:21 被阅读20次
    image.png

    一、什么是383任务?

    好牛逼的名字,有木有,哈哈,其实就是给chat和tag之间加个中间model,就像上面图片所说的,增加Chat::Tag模型

    本来打算9.6~9.8号3天完成的,结果却是这样:

    image.png

    到9.25号才完成,花了20天才完成,7倍啊,我也是醉了。

    二、分析一下原因吧?

    总的来说,个人原因居多,自己水平不行啊,客观原因可能就是微信上问问题效率太慢,而且github上回复也慢呢

    仔细分析下犯的错误吧。数了一下,至少30个以上的错误,这里选择31个比较有代表性的。

    1、不小心把本地的Gemfile.lock给上传了

    image.png

    2、chat/customer.rb忘记加accepts_nested_attributes_for、json接口和customers_tags_attributes属性


    image.png

    首先,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

    image.png

    4、字母序

    image.png

    5、少了acts_as_paranoid(现在知道了这是软删除)

    image.png

    6、tag也要加上validate

    image.png

    当时没有认真想想tag添加的时候也要验证一下在未删除情况下唯一性、是否存在

    7、这个忘记加dependent::restrict_with_error了(现在知道了,当tag被customer使用时是不能删除的,当出现有关联的tag被删除时,restrict_with_error会限制并报错)

    image.png

    8、字母序

    image.png

    9、本来抄系统里别的文件的代码,但是感觉enabled的默认值应该是true才对,于是将原来的false改成true,谁知道数据库的默认值都为false,由Ruby代码控制实际默认值的

    image.png

    10、lock_version是乐观锁,忘加了

    image.png

    11、不知道还能这么变(现在知道了,可以写成这样,代码更少,但是不知道为什么要要加deleted_at_and_customer_id_and_tag_id)

    image.png

    12、不知道Rails标准(现在知道了,如果要加索引,可以这样)

    image.png

    13、少了allow_destroy(加上这个就也能把关联的属性删除)

    image.png

    14、customer对应的是多个customers_tags,这里我直接写成了一个tag_id,明显不对嘛,在写这个的时候,还是20天前,那时候对这些关联啊懵懵懂懂的,现在基本都明白了

    为嘛json_options不用写

    image.png

    15、写多了一行,太粗心了

    image.png

    16、这个也是对acts_as_paranoid不知道,所以犯了这么个错误

    image.png

    17、要加上validate

    image.png

    18、又是字母序

    image.png

    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,所以应该是多维数组的形式来传参数

    image.png

    22、这也不对

    zhe'ye

    23、当时完全不会做,剑爸5分钟写出来的,后来还是需要修改一下。

    因为当时是通过chat/cusomer修改bag/customer,有且只有这样的逻辑,所以没加上chat/cusomter本身的修改。

    另外,chat/customer和bag/customer的关联是polymorphic的,如果用accepts_nested_attributes_for 需要手动指定type,前端就比较复杂。

    image.png

    后来改成这样了

        @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、这句话啥意思

    image.png

    有很多疑问,比如什么是customizable,什么是polymorphic类型

    customizable是customer的多态类型,那么,可以这样定义:

    belongs_to :chat
    

    为什么polymorphic类型的关联不能直接用accepts_nested_attributes_for

    25、学习了

    image.png

    26、系统会自动读取chat/customers_tag的表名

    image.png

    27、学习了


    image.png

    28、如果换成t.格式的话就要写在creat_table里面

    image.png

    29、为什么要加上chatroom.find(user_name:params[:id])呢?

    image.png

    user_name是微信用户登录的识别码

    30、method::get 可以省略 这是因为默认就是get方式

    image.png

    31、让我用transaction写,但是不会写啊,后来剑爸写的

    image.png

    第一次做这么完整一点的任务,包含三个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

    相关文章

      网友评论

          本文标题:383任务复盘

          本文链接:https://www.haomeiwen.com/subject/jbfiextx.html