From fcf8dd4e2341496a257d2832b2db182c99806581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn?= Date: Wed, 1 Jun 2016 13:46:45 +0200 Subject: [PATCH] Add support for polymorphic preload Fixes #1051 --- callback_query_preload.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/callback_query_preload.go b/callback_query_preload.go index a4b1cf1f..4d2678bd 100644 --- a/callback_query_preload.go +++ b/callback_query_preload.go @@ -104,8 +104,15 @@ func (scope *Scope) handleHasOnePreload(field *Field, conditions []interface{}) preloadDB, preloadConditions := scope.generatePreloadDBWithConditions(conditions) // find relations + query := fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relation.ForeignDBNames), toQueryMarks(primaryKeys)) + values := toQueryValues(primaryKeys) + if relation.PolymorphicType != "" { + query += fmt.Sprintf(" AND %v = ?", scope.Quote(relation.PolymorphicDBName)) + values = append(values, scope.TableName()) + } + results := makeSlice(field.Struct.Type) - scope.Err(preloadDB.Where(fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relation.ForeignDBNames), toQueryMarks(primaryKeys)), toQueryValues(primaryKeys)...).Find(results, preloadConditions...).Error) + scope.Err(preloadDB.Where(query, values...).Find(results, preloadConditions...).Error) // assign find results var ( @@ -143,8 +150,15 @@ func (scope *Scope) handleHasManyPreload(field *Field, conditions []interface{}) preloadDB, preloadConditions := scope.generatePreloadDBWithConditions(conditions) // find relations + query := fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relation.ForeignDBNames), toQueryMarks(primaryKeys)) + values := toQueryValues(primaryKeys) + if relation.PolymorphicType != "" { + query += fmt.Sprintf(" AND %v = ?", scope.Quote(relation.PolymorphicDBName)) + values = append(values, scope.TableName()) + } + results := makeSlice(field.Struct.Type) - scope.Err(preloadDB.Where(fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relation.ForeignDBNames), toQueryMarks(primaryKeys)), toQueryValues(primaryKeys)...).Find(results, preloadConditions...).Error) + scope.Err(preloadDB.Where(query, values...).Find(results, preloadConditions...).Error) // assign find results var (