下面举几个例子

需求是根据手机号和邀请码来判断该用户是否是有效的,继而完成之后的操作步骤。而数据库只有手机号和邀请码二个字段,那么我们需要怎么做呢?最简单的办法是把状态存在数据库里,加一个字段的事儿。这种方法很好,但对于一个代码洁癖爱好者来说是无法忍受的,明明手机号和邀请码已经可以表达了业务含义,为啥还要多加一个字段呢?

  1. if(this.phone_number == undefined | this.invite_code == undefined){
  2. return false;
  3. }
  4. return this.invite_code.length >= 2 && this.phone_number > 10000000
  5. });

看一下具体测试,主要针对2种情况

  • 当同时有invite_code和phone_number
  • 当只有phone_number时

执行

  1. $ cd db && ava -v virtual/test.js
  2. 数据库连接成功
  3. #is_valid() === true if user_with_invite_code
  4. 2 tests passed

把表拆了,重写?那太不划算了,好的做法是使用virtual属性对字段进行二次加工、转换、格式化等等操作。

这样就可以在不变表结构的情况下,增加province,,county,detail_address,这是非常便捷的,无入侵的。

  1. import test from 'ava';
  2. // 1、引入`mongoose connect`
  3. require('../connect');
  4. // 2、引入`User` Model
  5. const User = require('../user/virtual/user2');
  6. // 3、定义`user` Entity
  7. const user = new User({
  8. username: 'i5ting',
  9. password: '0123456789',
  10. });
  11. test.before.cb(t => {
  12. User.remove({}, (err, result) => {
  13. t.end()
  14. })
  15. })
  16. test('#province city county detail_address', t => {
  17. user.save((err, u) => {
  18. t.is(u.province, '天津')
  19. t.is(u.city, '天津')
  20. t.is(u.county, '东丽区')
  21. t.is(u.detail_address, '空港商务园')
  22. });

执行