diff --git a/lib/relation-definition.js b/lib/relation-definition.js index bace4705..aa42e086 100644 --- a/lib/relation-definition.js +++ b/lib/relation-definition.js @@ -398,6 +398,25 @@ function lookupModel(models, modelName) { } } +function lookupModelTo(modelFrom, modelTo, params, singularize) { + if ('string' === typeof modelTo) { + params.as = params.as || modelTo; + if (typeof params.model === 'function') { + modelTo = params.model; + } else if (typeof params.model === 'string') { + modelTo = params.model; + } + if (typeof modelTo === 'string') { + var modelToName = (singularize ? i8n.singularize(modelTo) : modelTo).toLowerCase(); + modelTo = lookupModel(modelFrom.dataSource.modelBuilder.models, modelToName) || modelTo; + } + if (typeof modelTo === 'string') { + throw new Error('Could not find "' + modelTo + '" relation for ' + modelFrom.modelName); + } + } + return modelTo; +} + /*! * Normalize polymorphic parameters * @param {Object|String} params Name of the polymorphic relation or params @@ -436,15 +455,7 @@ function polymorphicParams(params) { RelationDefinition.hasMany = function hasMany(modelFrom, modelTo, params) { var thisClassName = modelFrom.modelName; params = params || {}; - if (typeof modelTo === 'string') { - params.as = modelTo; - if (params.model) { - modelTo = params.model; - } else { - var modelToName = i8n.singularize(modelTo).toLowerCase(); - modelTo = lookupModel(modelFrom.dataSource.modelBuilder.models, modelToName); - } - } + modelTo = lookupModelTo(modelFrom, modelTo, params, true); var relationName = params.as || i8n.camelize(modelTo.pluralModelName, true); var fk = params.foreignKey || i8n.camelize(thisClassName + '_id', true); @@ -953,13 +964,7 @@ RelationDefinition.belongsTo = function (modelFrom, modelTo, params) { var discriminator, polymorphic; params = params || {}; if ('string' === typeof modelTo && !params.polymorphic) { - params.as = modelTo; - if (params.model) { - modelTo = params.model; - } else { - var modelToName = modelTo.toLowerCase(); - modelTo = lookupModel(modelFrom.dataSource.modelBuilder.models, modelToName); - } + modelTo = lookupModelTo(modelFrom, modelTo, params); } var idName, relationName, fk; @@ -1182,19 +1187,9 @@ BelongsTo.prototype.related = function (refresh, params) { */ RelationDefinition.hasAndBelongsToMany = function hasAndBelongsToMany(modelFrom, modelTo, params) { params = params || {}; + modelTo = lookupModelTo(modelFrom, modelTo, params, true); + var models = modelFrom.dataSource.modelBuilder.models; - - if ('string' === typeof modelTo) { - params.as = modelTo; - if (params.model) { - modelTo = params.model; - } else { - modelTo = lookupModel(models, i8n.singularize(modelTo)) || modelTo; - } - if (typeof modelTo === 'string') { - throw new Error('Could not find "' + modelTo + '" relation for ' + modelFrom.modelName); - } - } if (!params.through) { if (params.polymorphic) throw new Error('Polymorphic relations need a through model'); @@ -1243,15 +1238,7 @@ RelationDefinition.hasAndBelongsToMany = function hasAndBelongsToMany(modelFrom, */ RelationDefinition.hasOne = function (modelFrom, modelTo, params) { params = params || {}; - if ('string' === typeof modelTo) { - params.as = modelTo; - if (params.model) { - modelTo = params.model; - } else { - var modelToName = modelTo.toLowerCase(); - modelTo = lookupModel(modelFrom.dataSource.modelBuilder.models, modelToName); - } - } + modelTo = lookupModelTo(modelFrom, modelTo, params); var pk = modelFrom.dataSource.idName(modelTo.modelName) || 'id'; var relationName = params.as || i8n.camelize(modelTo.modelName, true); @@ -1476,18 +1463,10 @@ HasOne.prototype.related = function (refresh, params) { }; RelationDefinition.embedsMany = function embedsMany(modelFrom, modelTo, params) { - var thisClassName = modelFrom.modelName; params = params || {}; - if (typeof modelTo === 'string') { - params.as = modelTo; - if (params.model) { - modelTo = params.model; - } else { - var modelToName = i8n.singularize(modelTo).toLowerCase(); - modelTo = lookupModel(modelFrom.dataSource.modelBuilder.models, modelToName); - } - } + modelTo = lookupModelTo(modelFrom, modelTo, params, true); + var thisClassName = modelFrom.modelName; var accessorName = params.as || (i8n.camelize(modelTo.modelName, true) + 'List'); var relationName = params.property || i8n.camelize(modelTo.pluralModelName, true); var fk = modelTo.dataSource.idName(modelTo.modelName) || 'id'; @@ -1925,18 +1904,10 @@ EmbedsMany.prototype.remove = function (acInst, cb) { }; RelationDefinition.referencesMany = function referencesMany(modelFrom, modelTo, params) { - var thisClassName = modelFrom.modelName; params = params || {}; - if (typeof modelTo === 'string') { - params.as = modelTo; - if (params.model) { - modelTo = params.model; - } else { - var modelToName = i8n.singularize(modelTo).toLowerCase(); - modelTo = lookupModel(modelFrom.dataSource.modelBuilder.models, modelToName); - } - } + modelTo = lookupModelTo(modelFrom, modelTo, params, true); + var thisClassName = modelFrom.modelName; var relationName = params.as || i8n.camelize(modelTo.pluralModelName, true); var fk = params.foreignKey || i8n.camelize(modelTo.modelName + '_ids', true); var idName = modelTo.dataSource.idName(modelTo.modelName) || 'id';