From 7a334f648f4bf1d216758a01e7c2f550e0f5deb1 Mon Sep 17 00:00:00 2001 From: lame-nickname Date: Fri, 11 Apr 2014 21:23:46 +0200 Subject: [PATCH 1/2] Add model inheritance via struct's anonymous fields --- scope.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/scope.go b/scope.go index 543c4cde..806af4f7 100644 --- a/scope.go +++ b/scope.go @@ -237,12 +237,21 @@ func (scope *Scope) Fields() []*Field { continue } + value := indirectValue.FieldByName(fieldStruct.Name) + iface := value.Interface() + elem := reflect.Indirect(value) + + if fieldStruct.Anonymous && elem.Kind() == reflect.Struct { + inner_fields := scope.New(iface).Fields() + fields = append(fields, inner_fields...) + continue + } + var field Field field.Name = fieldStruct.Name field.DBName = toSnake(fieldStruct.Name) - value := indirectValue.FieldByName(fieldStruct.Name) - field.Value = value.Interface() + field.Value = iface field.IsBlank = isBlank(value) // Search for primary key tag identifier @@ -257,7 +266,6 @@ func (scope *Scope) Fields() []*Field { field.SqlTag = scope.sqlTagForField(&field) // parse association - elem := reflect.Indirect(value) typ := elem.Type() switch elem.Kind() { From 9d73acb064876480e3dd66c4b75ef5df82b59f06 Mon Sep 17 00:00:00 2001 From: lame-nickname Date: Sat, 12 Apr 2014 14:52:40 +0200 Subject: [PATCH 2/2] Use correct order during multiple inheritance via anonymous fields --- scope.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/scope.go b/scope.go index 806af4f7..1b7c1280 100644 --- a/scope.go +++ b/scope.go @@ -224,10 +224,10 @@ func (scope *Scope) CombinedConditionSql() string { // Fields get value's fields func (scope *Scope) Fields() []*Field { indirectValue := reflect.Indirect(reflect.ValueOf(scope.Value)) - fields := []*Field{} + fields := make(map[string]*Field) if !indirectValue.IsValid() { - return fields + return []*Field{} } scopeTyp := indirectValue.Type() @@ -242,8 +242,11 @@ func (scope *Scope) Fields() []*Field { elem := reflect.Indirect(value) if fieldStruct.Anonymous && elem.Kind() == reflect.Struct { - inner_fields := scope.New(iface).Fields() - fields = append(fields, inner_fields...) + for _, f := range scope.New(iface).Fields() { + if _, ok := fields[f.Name]; !ok { + fields[f.Name] = f + } + } continue } @@ -294,10 +297,14 @@ func (scope *Scope) Fields() []*Field { } } } - fields = append(fields, &field) + fields[field.Name] = &field } - return fields + field_list := make([]*Field, len(fields)) + for _, field := range fields { + append(field_list, field) + } + return field_list } // Raw set sql