为调度应用程序提供续订模型关联

时间:2015-05-11 06:26:52

标签: javascript node.js postgresql sequelize.js

我正在开发一个处理大型童子军阵营计划安排的应用程序。我关注的主要模型是:

计划代表个人计划活动(例如皮划艇,山地自行车等。此模型上有许多字段,其中没有一个与此问题相关。

var Program = sequelize.define("Program", {
    name: {
      type: DataTypes.STRING,
      allowNull: false
    },
    max_participants_per_period: DataTypes.INTEGER,
    [...bunch of other fields...]
  }, {
    underscored: true,
    classMethods: {
      associate: function(models) {
        Program.hasMany(models.ProgramPeriod);
      }
    }
});

每个程序都安排在一个ProgramPeriod中。 ProgramPeriod具有开始和结束时间。不同的节目持续时间不同(有些是半天,有些则是全天等)。

var ProgramPeriod = sequelize.define('ProgramPeriod', {
    start_at: DataTypes.DATE,
    end_at: DataTypes.DATE
  }, {
    underscored: true,
    classMethods: {
      associate: function(models) {
        ProgramPeriod.belongsToMany(models.Unit, { through: 'Schedule' });
        ProgramPeriod.belongsTo(models.Program);
      }
    }
});

一个部队是一群侦察员和领导者。一个单元将通过ProgramPeriod安排到任意数量的程序中。还有许多与此问题无关的其他字段。

var Unit = sequelize.define("Unit", {
    unit_number: {
      type: DataTypes.STRING,
      unique: true
    },
    number_of_youth: DataTypes.INTEGER,
    number_of_leaders: DataTypes.INTEGER,
  }, {
    classMethods: {
      associate: function(models) {
        Unit.belongsToMany(models.ProgramPeriod, { through: 'Schedule', foreignKey: 'unit_id' });
      }
    },
    getterMethods: {
      total_participants: function() {
        return this.number_of_youth + this.number_of_leaders;
      }
    }
  });

图表:

┌────────────────┐                                  ┌─────────────────────────┐                
│                │                                  │      ProgramPeriod      │                
│    Program     │                                ╱│       pk: id(INT)       │                
│  pk: id(INT)   │─Program.hasMany(ProgramPeriod)───│   fK: program_id(INT)   │                
│                │                                ╲│ references Programs.id  │                
└────────────────┘                                  │                         │                
                                                    └─────────────────────────┘                
                                                                ╲│╱                            
                                                                  │                             
                                                                  │                             
                                                                  │                             
                                     ProgramPeriod.belongsToMany(Unit, { through: Schedule })  
                                                                  │                             
                                                                  │                             
                                                                  │                             
                                                                ╱│╲                            
                                                    ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐                

                                                    │        Schedule         │                
                                                              unit_id                          
                                                    │    program_period_id    │                

                                                    └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘                
                                                                ╲│╱                            
                                                                  │                             
                                                                  │                             
                                                                  │                             
                                     Unit.belongsToMany(ProgramPeriod, { through: Schedule })  
                                                                  │                             
                                                                  │                             
                                                                  │                             
                                                                ╱│╲                            
                                                    ┌─────────────────────────┐                
                                                    │                         │                
                                                    │          Units          │                
                                                    │       pk: id(INT)       │                
                                                    │                         │                
                                                    │                         │                
                                                    └─────────────────────────┘                

通过此设置,我可以查询分配给Unit Program的所有ProgramPeriod

Program.find({ 
    where: { id: 1 }, 
    include: [{ model: models.ProgramPeriod, 
                include: [ models.ProgramPeriod.associations.Schedule ]  
             }]
});

...我可以查询Unit的{​​{1}}的日程安排:

Program

我无法搞清楚安排所需的一些事情。假设单元id 174有10个参与者。对于任何给定的Unit.find({ where: { id: 174 }, include: [{ model: models.ProgramPeriod, include: [ models.ProgramPeriod.associations.Program] }] }) ,我需要查询具有足够空间的所有Program,并且不要与该单元上已有的任何其他ProgramPeriods时间冲突。时间表。

我与以上任何协会都没有关系;如果它能让你更容易完成,我可以改变一切。

谢谢!

0 个答案:

没有答案