attribute(attribute, parent) {
      switch (attribute) {
        case 'parentIdAttribute':
          if (this.isThrough()) {
            if (this.type === 'belongsTo' && this.throughForeignKey) {
              return this.throughForeignKey;
            }

            if (this.type === 'belongsToMany' && this.isThroughForeignKeyTargeted()) {
              return this.throughForeignKeyTarget;
            }

            if (this.isOtherKeyTargeted()) {
              return this.otherKeyTarget;
            }

            return this.parentIdAttribute; // Return attribute calculated on `init` by default.
          }

          if (this.type === 'belongsTo' && this.foreignKey) {
            return this.foreignKey;
          }

          if (this.type !== 'belongsTo' && this.isForeignKeyTargeted()) {
            return this.foreignKeyTarget;
          }

          return _.result(parent, 'idAttribute');

        case 'targetIdAttribute':
          if (this.isThrough()) {
            if ((this.type === 'belongsToMany' || this.type === 'belongsTo') && this.isOtherKeyTargeted()) {
              return this.otherKeyTarget;
            }

            return this.targetIdAttribute; // Return attribute calculated on `init` by default.
          }

          if (this.type === 'morphTo' && !parent._isEager) {
            return _.result(this.target.prototype, 'idAttribute');
          }

          if (this.type === 'belongsTo' && this.isForeignKeyTargeted()) {
            return this.foreignKeyTarget;
          }

          if (this.type === 'belongsToMany' && this.isOtherKeyTargeted()) {
            return this.otherKeyTarget;
          }

          return this.targetIdAttribute;

        case 'throughIdAttribute':
          if (this.type !== 'belongsToMany' && this.isThroughForeignKeyTargeted()) {
            return this.throughForeignKeyTarget;
          }

          if (this.type === 'belongsToMany' && this.throughForeignKey) {
            return this.throughForeignKey;
          }

          return _.result(parent.prototype, 'idAttribute');

        case 'parentFk':
          if (!this.hasParentAttributes()) {
            return;
          }

          if (this.isThrough()) {
            if (this.type === 'belongsToMany' && this.isThroughForeignKeyTargeted()) {
              return this.parentAttributes[this.throughForeignKeyTarget];
            }

            if (this.type === 'belongsTo') {
              return this.throughForeignKey ? this.parentAttributes[this.parentIdAttribute] : this.parentId;
            }

            if (this.isOtherKeyTargeted()) {
              return this.parentAttributes[this.otherKeyTarget];
            }

            return this.parentFk; // Return attribute calculated on `init` by default.
          }

          return this.parentAttributes[this.isInverse() ? this.key('foreignKey') : this.parentIdAttribute];
      }
    }
Get the correct name for the following attributes:
 - parentIdAttribute
 - targetIdAttribute
 - throughIdAttribute
 - parentFk

@param {string} attribute The attribute name being requested.
@param {Model} [parent] The parent model.
@return {string}