Node.js で簡単にウェブアプリケーションを作成するフレームワーク sails.js を使って「多対多」のモデルを定義する。
sails.jsはアップデート頻度が高い⇒この記事執筆時点と仕様が異なっている可能性があるのでバージョンに注意
この記事の内容をテストした環境
- node.js 0.10.x
- sails.js 0.10.x
多対多のモデルをつくる
「ユーザー」と「飲み物」で好きな飲み物を保存できるようにする
- ユーザーは「ひなた」と「まどか」
- 飲み物は「Dr. Pepper」と「Coca-Cola」
- ひなたはDr. Pepperが好きで、まどかは両方好き
ユーザー User.js
ソースコードのひな形を準備する
sails generate api User
models/User.js
を次のように変更
User.js
module.exports = {
attributes: {
name: 'string',
favorites: {
collection: 'Drink',
via: 'users',
dominant: true
}
}
}
ポイント
- ユーザーの好きな飲み物を favorites として定義
- collection として、飲み物のモデル Drink を指定
- via で Drink.js で定義したプロパティ名を指定
- dominant ※どちらかにtrueしておく(今回は特に意味は無い)
飲み物 Drink.js
ソースコードのひな形を準備する
sails generate api Drink
models/Drink.js
を次のように変更
Drink.js
module.exports = {
attributes: {
name: 'string',
users: {
collection: 'User',
via: 'favorites'
}
}
}
ポイント
- この飲み物が好きなユーザーを users として定義
- collection として、ユーザーのモデル User を指定
- via で User.js で定義したプロパティ名を指定
- dominant は無し
実験
とても便利なsails console
を使用
sails console
でコンソールを起動。ユーザーHinata
とMadoka
を登録
User.create({name:'Hinata'}).exec(console.log)
=> id:1
User.create({name:'Madoka'}).exec(console.log)
=> id:2
飲み物のDr. Pepper
とCoca-Cola
を登録、HinataはDr. Pepperが好きで、Madokaは両方好き
Drink.create({name:'Dr. Pepper', users:[1]}).exec(console.log)
=> id:1
Drink.create({name:'Coca-Cola', users:[1, 2]}).exec(console.log)
=> id:2
ヽ(゚ー゚ヽ)(ノ゚ー゚)ノわぁい