Skip to content

Commit

Permalink
Merge pull request go-gorm#1451 from ModelRocket/master
Browse files Browse the repository at this point in the history
gorm:auto_preload setting to enable auto preloading associations
  • Loading branch information
jinzhu authored May 4, 2017
2 parents 717654b + e470b44 commit 9acaa33
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 0 deletions.
25 changes: 25 additions & 0 deletions callback_query_preload.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,17 @@ import (
"errors"
"fmt"
"reflect"
"strconv"
"strings"
)

// preloadCallback used to preload associations
func preloadCallback(scope *Scope) {

if _, ok := scope.Get("gorm:auto_preload"); ok {
autoPreload(scope)
}

if scope.Search.preload == nil || scope.HasError() {
return
}
Expand Down Expand Up @@ -79,6 +85,25 @@ func preloadCallback(scope *Scope) {
}
}

func autoPreload(scope *Scope) {
for _, field := range scope.Fields() {
if field.Relationship == nil {
continue
}

if val, ok := field.TagSettings["PRELOAD"]; ok {
if preload, err := strconv.ParseBool(val); err != nil {
scope.Err(errors.New("invalid preload option"))
return
} else if !preload {
continue
}
}

scope.Search.Preload(field.Name)
}
}

func (scope *Scope) generatePreloadDBWithConditions(conditions []interface{}) (*DB, []interface{}) {
var (
preloadDB = scope.NewDB()
Expand Down
27 changes: 27 additions & 0 deletions preload_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,33 @@ func TestPreload(t *testing.T) {
}
}

func TestAutoPreload(t *testing.T) {
user1 := getPreloadUser("auto_user1")
DB.Save(user1)

preloadDB := DB.Set("gorm:auto_preload", true).Where("role = ?", "Preload")
var user User
preloadDB.Find(&user)
checkUserHasPreloadData(user, t)

user2 := getPreloadUser("auto_user2")
DB.Save(user2)

var users []User
preloadDB.Find(&users)

for _, user := range users {
checkUserHasPreloadData(user, t)
}

var users2 []*User
preloadDB.Find(&users2)

for _, user := range users2 {
checkUserHasPreloadData(*user, t)
}
}

func TestNestedPreload1(t *testing.T) {
type (
Level1 struct {
Expand Down

0 comments on commit 9acaa33

Please sign in to comment.