through(source, Target, options) {
      const type = this.type;
      if (type !== 'hasOne' && type !== 'hasMany' && type !== 'belongsToMany' && type !== 'belongsTo') {
        throw new Error('`through` is only chainable from `hasOne`, `belongsTo`, `hasMany`, or `belongsToMany`');
      }

      this.throughTarget = Target;
      this.throughTableName = _.result(Target.prototype, 'tableName');

      _.extend(this, options);
      _.extend(source, PivotHelpers);

      this.parentIdAttribute = this.attribute('parentIdAttribute');
      this.targetIdAttribute = this.attribute('targetIdAttribute');
      this.throughIdAttribute = this.attribute('throughIdAttribute', Target);
      this.parentFk = this.attribute('parentFk');

      // Set the appropriate foreign key if we're doing a belongsToMany, for convenience.
      if (this.type === 'belongsToMany') {
        this.foreignKey = this.throughForeignKey;
      } else if (this.otherKey) {
        this.foreignKey = this.otherKey;
      }

      return source;
    }
Initializes a `through` relation, setting the `Target` model and `options`, which includes
any additional keys for the relation.

@param {Model|Collection} source
@param {Model} Target The pivot model the related models or collections run through.
@param {object} options Additional properties to set on the relation object.