2016-07-01 17 views
6

Mam tabelę użytkownika i tabelę atrybutów użytkownika. Każdy użytkownik może mieć tylko jedną instancję każdej wartości atrybutu userAttribute, dlatego chciałbym utworzyć złożony unikalny indeks dla nazwy kolumny i identyfikatora użytkownika (Jest to tworzone przez userAttributes.belongsTo). Jak to zrobić?Utwórz indeks złożony z powiązanymi danymi?

UserAttribute = sequelize.define('userAttributes', { 
    name: { 
     type:  Sequelize.STRING, 
     allowNull: false, 
     unique: 'nameIndex', 
     validate: { 
      isIn: [['phone', 'name','driverRequest']], 
     } 
    }, 
    value: { 
     type:  Sequelize.STRING, 
     allowNull: false 
    }, 
}); 


User.hasMany(userAttributes, {unique: 'nameIndex'}); 
userAttributes.belongsTo(User, {unique: 'nameIndex'}); 

Dodaję unikalne unikalne nameIndex bez powodzenia, wydaje się, że dotyczy to tylko kolumny nazwy.

+0

Mam zmodyfikowany przykład poniżej korzystania z Composite Index, myślę, że to powinno działać, daj mi znać, jeśli nie –

+0

Czy to, co zrobiłeś, aby ręcznie dodać w useId w segmencie danych modelu? Brakuje mi również atrybutu wartości? – Himmators

+0

Nie mogę naprawdę zrozumieć niektórych rzeczy. Napisałeś: "Każdy użytkownik może mieć tylko jedną instancję każdej wartości atrybutu userAttribute, dlatego chciałbym utworzyć złożony unikalny indeks dla nazwy kolumny i userId". Uważam, że te 2 indeksy (userId i nazwa) są zapisywane w userAttribute, popraw mnie, jeśli się mylę. W poniższym kodzie, który podaję, widzę nowe pole "wartość", nie jestem pewien, do czego jest przeznaczony, czy możesz podać więcej informacji na jego temat? lub wyjaśnić, gdzie brakuje kontekstu problemu? –

Odpowiedz

3
var Sequelize = require('sequelize'); 
var sequelize = new Sequelize('<yourDatabaseName>', '<yourUserName>', '<yourPassword', { 
    host: '<ip>' 
}); 

var User = sequelize.define('user', { 
    id: { 
    type: Sequelize.STRING, 
    allowNull: false, 
    primaryKey: true 
    }, 
}); 
var UserAttribute = sequelize.define('userattribute', { 
    userId: { 
    type: Sequelize.STRING, 
    allowNull: false, 
    unique: 'compositeIndex', 
    references: { 
     model: User, 
     key: "id" 
    } 
    }, 
    name: { 
    type: Sequelize.STRING, 
    allowNull: false, 
    unique: 'compositeIndex' 
    } 
}); 

User.hasOne(UserAttribute, { 
    as: "UserAttribute" 
}) 

UserAttribute.belongsTo(User, { 
    foreignKey: "userId", 
    as: 'UserId' 
}) 


sequelize.sync({ 
    // use force to delete tables before generating them 
    force: true 
}).then(function() { 
    console.log('tables have been created'); 
    return User.create({ 
    id: 'randomId1' 
    }); 
}) 
    .then(function() { 
    console.log('tables have been created'); 
    return User.create({ 
     id: 'randomId2' 
    }); 
    }) 
    .then(function() { 
    return UserAttribute.create({ 
     userId: 'randomId1', 
     name: 'name1' 
    }); 
    }) 
    .then(function() { 
    return UserAttribute.create({ 
     userId: 'randomId2', 
     name: 'name1' 
    }); 
    }) 
    // // generates Validation Error 
    // .then(function() { 
    // return UserAttribute.create({ 
    //  userId: 'randomId1', 
    //  name: 'name1' 
    // }); 
    // }) 
Powiązane problemy