2016-05-22 4 views
0

ich weiß nicht, ob dies möglich ist, gibt es zwei Modelle, die durch Beziehung verbunden sind, und Modelle auf diese Weise definiert sind:Sequelize: kann Attribut Wert aus Beziehungsattributdaten haben?

sequelize.define('account_has_plan', { 
     account_id: { 
      type: DataTypes.INTEGER(10), 
      allowNull: false, 
      primaryKey: true, 
      references: { 
       model: 'account', 
       key: 'id' 
      } 
     }, 
     plan_id: { 
      type: DataTypes.INTEGER(10), 
      allowNull: false, 
      primaryKey: true, 
      references: { 
       model: 'plan', 
       key: 'id' 
      } 
     }, 
     type_id: { 
      type: DataTypes.INTEGER(10), 
      allowNull: false, 
      primaryKey: true, 
      references: { 
       model: 'type', 
       key: 'id' 
      } 
     }, 
     create_at: { 
      type: DataTypes.DATE, 
      allowNull: true, 
      defaultValue: 'CURRENT_TIMESTAMP' 
     }, 
     update_at: { 
      type: DataTypes.DATE, 
      allowNull: true, 
      defaultValue: 'CURRENT_TIMESTAMP' 
     } 
    }, { 
     tableName: 'account_has_plan', 
     underscored: true, 
     freezeTableName: true, 
     timestamps: false 
    }); 

sequelize.define('type', { 
     id: { 
      type: DataTypes.INTEGER(10), 
      allowNull: false, 
      primaryKey: true, 
      autoIncrement: true 
     }, 
     name: { 
      type: DataTypes.STRING, 
      allowNull: false 
     }, 
     element: { 
      type: DataTypes.ENUM('Meal','Workout','Status'), 
      allowNull: false 
     } 
    }, { 
     tableName: 'type', 
     freezeTableName: true, 
     timestamps: false 
    }); 

der Code auf die Anrufe, die Modelle und führen Sie die Abfrage an die DB ist dies:

var model = $.loadModel("account_has_plan"); 
var type = $.loadModel("type"); 


model.belongsTo(type); 

var query = { 
    where: { 
     account_id: $.params.accountId 
    }, 
    limit: $.query.limit || 12, 
    offset: $.query.offset || 0, 
    attributes:["account_id"], 
    include: [{ 
     model: type 
    }] 
}; 

model.findAll(query) 
    .then(function(data){ 
     $.data = data; 
     $.json(); 
    }) 
    .catch(function(err){ 
     console.log(err); 
     errorHandler.throwStatus(500, $); 
    }); 

auf diese Weise die Daten von dem Server antwortet wie folgt aus:

{ 
    "account_id": 1, 
    "type": { 
     "id": 2, 
     "name": "Arms", 
     "element": "Workout" 
    } 
    } 

es eigentlich kein Problem mit diesen Daten ist, aber ich Ich bin gezwungen, ein Muster aus Dokumenten zu folgen, die mir zur Verfügung gestellt wurde, wobei der Unterschied darin besteht, dass type tatsächlich ein String-Wert und nicht Objektwert ist, wie im Beispiel dargestellt, so dass am Ende die Datenstruktur, die ich bekommen möchte, ähnlich sein muss dies:

{ 
    "account_id": 1, 
    "type": "Arms" 
} 

ich habe tatsächlich, wie Idee auf, wie dies zu erreichen, ich weiß, ich mit sequelize wenig Übung habe, vielleicht hat dies durch eine Modell-Methode definiert werden oder mit through im Referenz (was ich versucht habe aber gibt Fehler zurück) aber der Punkt ist .. ich muss wissen, ob es möglich sein kann, bevor ich eine Änderung auf der REST-Dokumentation berichten muss, die groß ist

Antwort

1

Erstens, da das, was Sie durch eine Sequelize-Abfrage bekommen werden, Instanzen sind, müssen Sie sie in "normale" Objekte konvertieren. Sie könnten das tun, indem Sie ein Modul namens sequelize-values verwenden.

Dann sollten Sie in der Lage sein, den Wert manuell dem Wert zuzuordnen, den Sie suchen.

model.findAll(query) 
.then(function(data){ 
    return data.map(function(d){ 
     var rawValue = d.getValues(); 
     rawValue.type = rawValue.type.name; 
     return rawValue; 
    }); 
}) 
.then(function(data){ 
    $.data = data; 
    $.json(); 
}) 
.catch(function(err){ 
    console.log(err); 
    errorHandler.throwStatus(500, $); 
}); 
+0

Dies ist nützlich, aber ich möchte wissen, ob es einen Weg gibt, dies zu erreichen, ohne ein Modul herunterladen oder diese Logik außerhalb des Modells machen zu müssen – nosthertus

Verwandte Themen