2017-02-23 9 views
0
var _ = require('lodash'); 
var Promise = require('bluebird'); 
var Sequelize = require('sequelize'); 
var ResourceNotFound = require('./errors').ResourceNotFound; 
var ResourceAccessDenied = require('./errors').ResourceAccessDenied; 
var ResourceExpired = require('./errors').ResourceExpired; 

var ConferenceState = { 
    NEW: 'new', 
    ... 
}; 

module.exports.define = function define(options) { 

    var sequelize = options.sequelize; 

    return sequelize.define('conference', { 

     id: { 
      type: Sequelize.UUID, 
      defaultValue: Sequelize.UUIDV4, 
      primaryKey: true 
     }, 

     startDate: { 
      type: Sequelize.DATE, 
     }, 

     endDate: { 
      type: Sequelize.DATE, 
     }, 

     state: { 
      type: Sequelize.ENUM(
       ConferenceState.NEW, 
       ... 
      ), 
      defaultValue: ConferenceState.NEW, 
      required: true, 
      allowNull: false 
     } 
    }, { 
     classMethods: { 

      getOrCreateConference: function createConference(data) { 

       return new Promise(function (resolve, reject) { 

        var Conference = sequelize.models.conference; 
        Conference.findOne({ 
         where: data 
        }).then(function(conference){ 
         if(_.isObject(conference)) { 
          resolve(conference); 
         } else { 
          return Conference.create(data); 
         } 
        }).then(function(conference){ 
         resolve(conference); 
        }).catch(function(err){ 
         reject(err); 
        }); 
       }); 
      }, 

      scheduleConference: function scheduleConference(start, end) { 
       // TODO 
      }, 
     } 
    }); 
}; 

私の質問は今、次のタスクにアプローチする方法についての理論上のいずれかになります。会議モデルは、 - (Sequelize)のスケジュールメソッドを作成

  • 会議が

スケジュールでなければならないので、会議は持っています修正開始日と終了日。値を持つフィールドを持つ必要があります。まだ開始されていない、または終了していないときに参加することもできません。それ以外の場合は、エラーが発生します。

私は会議をスケジュールし、開始値と終了値を渡したいというメッセージが必要です。

これは単一の方法で行うことができますか、または分割する必要がありますか?どのような方法が必要であり、彼らは基本的にどのような処置をするのでしょうか?

+1

あなたの方法で何をしたいですか?カンファレンスや他のアクションの 'startDate'と' endDate'を設定するだけです? – piotrbienias

+0

@piotrbieniasはい、それは最小要件です。後で他の方法は、会議に参加し、それがまだ有効か(開始、終了)および他の検証であるかどうかをチェックすることであろう。 – mrks

答えて

1

あなたのご意見によると、scheduleConferenceメソッドは指定されたインスタンス(会議)を更新するだけで済みます。あなたはclassMethodsに入れなかった、しかし、私はあなたがinstanceMethodsにそれを置く提案し、それは次のように単純な実装がかもしれだ:上記の方法

classMethods: { 
}, 
instanceMethods: { 
    scheduleConference: function(start, end){ 
     return this.update({ startDate: start, endDate: end }).then((conference) => { 
      // here you get updated instance of conference 
      return reference; 
     }); 
    } 
} 

は、このような方法

// assuming that conference is a sequelize model instance 
conference.scheduleConference(start, end).then((self) => { 
    // updated conference as self 
}); 


EDITで使用することができます

私はgetOrCreateConferenceメソッドを実装していますが、このようなメソッドはitsel fと呼ばれ、それはfindOrCreateと呼ばれます。あなたはmodels.Model.findOrCreate()のような続編のモデルでそれを使うことができます

関連する問題