関連付けスコープ
このセクションでは、モデルスコープと似ていますが同じではない関連付けスコープについて説明します。
関連付けスコープは、関連付けられたモデル(関連付けのターゲット)と、多対多関係のスルーテーブルの両方に配置できます。
概念
Model.scope('foo').findAll()などのモデルの静的呼び出しにモデルスコープが自動的に適用されるのと同様に、関連付けスコープは、モデルからインスタンス(モデル自身ではなくインスタンス)によって呼び出されるメソッド呼び出しに自動的に適用されるルール(より正確には、デフォルト属性とオプションのセット)です。ここで、インスタンス呼び出しとは、インスタンスから呼び出されるメソッド呼び出しを意味します。ミキシンは、インスタンスメソッドの主な例です(instance.getSomething、instance.setSomething、instance.addSomething、instance.createSomething)。
関連付けスコープは、モデルスコープと同様に、どちらもwhere句などの自動的な適用をファインダークエリに引き起こします。違いは、モデルスコープが静的ファインダークエリに適用されるのに対し、関連付けスコープはミキシンなどのインスタンスファインダークエリに自動的に適用されることです。
例
モデルFooとBar間の1対多関連付けの関連付けスコープの基本的な例を以下に示します。
- 
設定 const Foo = sequelize.define('foo', { name: DataTypes.STRING });
 const Bar = sequelize.define('bar', { status: DataTypes.STRING });
 Foo.hasMany(Bar, {
 scope: {
 status: 'open',
 },
 as: 'openBars',
 });
 await sequelize.sync();
 const myFoo = await Foo.create({ name: 'My Foo' });
- 
この設定の後、 myFoo.getOpenBars()を呼び出すと、次のSQLが生成されます。SELECT
 `id`, `status`, `createdAt`, `updatedAt`, `fooId`
 FROM `bars` AS `bar`
 WHERE `bar`.`status` = 'open' AND `bar`.`fooId` = 1;
これにより、.getOpenBars()ミキシンを呼び出すと、関連付けスコープ{ status: 'open' }が生成されたSQLのWHERE句に自動的に適用されたことがわかります。
標準スコープを使用した同じ動作の実現
標準スコープを使用して同じ動作を実現できます。
// Foo.hasMany(Bar, {
//     scope: {
//         status: 'open'
//     },
//     as: 'openBars'
// });
Bar.addScope('open', {
  where: {
    status: 'open',
  },
});
Foo.hasMany(Bar);
Foo.hasMany(Bar.scope('open'), { as: 'openBars' });
上記のコードでは、myFoo.getOpenBars()は上記と同じSQLを生成します。