node.js - 非映射属性 - Sequelize

标签 node.js reactjs sequelize.js redux sequelize-cli

支持的有:React、Redux 和 Sequelize。
基本上,我希望能够在 Redux 存储更新时将对象标记为 dirty

function updateCar(carToUpdate, car) {
    switch(car[1]) {
        case "models":
            carToUpdate.models = car[3];
            carToUpdate.setDirty();
            break;
    }    
};

然后当有人点击保存按钮时,我只想更新那些将脏标志设置为 true 的模型
var state = request.body;

state.forEach(function (car) {
    if (car && car.isDirty) {
        updateCar(car);
    }
}

现在我有以下汽车模型:
module.exports = function (sequelize, DataTypes) {
  var Cars = sequelize.define('Cars',
    {
      name: DataTypes.STRING,
      type: DataTypes.INTEGER,
      models: DataTypes.INTEGER,
      //Next is NOT working, this does not make it non-mapped
      isDirty: {
        type: DataTypes.BOOLEAN,
        scope: false
      },
    },
    {
      classMethods: {
        associate: function (models) {
          // associations can be defined here
        }
      },
      instanceMethods: {
        setDirty: function() {
          this.isDirty = true;
        }
      }
    });
  return Cars;
};

任何有非映射字段或类似经验的人?

最佳答案

终于找到了

汽车模型应该包含一个 VIRTUAL 属性:

module.exports = function (sequelize, DataTypes) {
  var Cars = sequelize.define('Cars',
    {
      name: DataTypes.STRING,
      type: DataTypes.INTEGER,
      models: DataTypes.INTEGER,
      isDirty: {
        type: DataTypes.VIRTUAL
      },
    },
    {
      classMethods: {
        associate: function (models) {
          // associations can be defined here
        }
      }
    });
  return Cars;
};

接下来应该在更新值时设置标志:
function updateCar(carToUpdate, car) {
    switch(car[1]) {
        case "models":
            carToUpdate.models = car[3];
            carToUpdate.isDirty = true;
            break;
    }    
};

然后save方法可以检查isDirty标志
var state = request.body;
state.forEach(function (car) {
    if (car && car.isDirty) {
        console.log(car.name +": "+ car.isDirty);
        updateCar(car);
    }
}, this);

最后但并非最不重要的是,我们将 isDirty 标志重置为 false,因此我们不会一遍又一遍地更新相同的模型。
var save = function () {
    var state = carStore.getState();
    return $.ajax({
        url: "/Cars/update",
        data: JSON.stringify(state),
        method: "POST",
        contentType: "application/json"
    }).then(function() {
        carStore.dispatch({
            type: 'resetDirty',
            data: null
        });
    });
};

以及重置标志的调度方法:
function updateReducer(state, action) {
    switch (action.type) {
        case 'load':
            return action.data;
        case 'update':
            return updateCars(action.carChanges, state);
        case 'resetDirty':
            return resetDirtyFlags(state);
        default:
            return action.data;
    }

}

function resetDirtyFlags(state) {
    var newState = $.extend(true, [], state);
    if(state) {
        newState.forEach(function(car) {
            car.isDirty = false;
        }, this);
        return newState;
    }
    return newState;
}

关于node.js - 非映射属性 - Sequelize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37205304/

相关文章:

node.js - 如何使用快速 session

javascript - 在 couchBase 中创建 View 时如何将输入变量设置为 json 中的键

javascript - VSCODE 无法识别标记海豚的 .env* 文件且无法识别 .env.local.* 文件

javascript - React-router:在链接和 map 匹配数据中传递 Prop

mysql - 支持转义查询标识符

javascript - JavaScript 中需要解释 : Different outputs when used for. ..in 和 for(;;)

javascript - 文本未换行并且正在获取屏幕 react native

javascript - Node js $like 查询

sequelize.js - aexmachina/factory-girl(节点)无法将工厂与非持久模型关联起来

javascript - 从当前文件夹压缩应用程序