Структура с самоссылками, записи с предварительно загруженными родителями переключаются между родителями и дочерними элементами

#go #go-gorm

#Вперед #go-gorm

Вопрос:

У меня есть структура, которая ссылается на себя, и когда я пытаюсь получить данные с помощью Preload записи, она каким-то образом переключается между родительским и дочерним элементами.

В этом примере я создал эти записи:

  1. Человек, вызванный менеджером 1
  2. Человек, называемый сотрудником 1, у которого есть менеджер 1 в качестве его родителя
  3. Человек, вызванный менеджером 2
  4. Человек, называемый сотрудником 2, у которого есть менеджер 2 в качестве его родителя

Вот код:

 package main

import (
    "fmt"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/postgres"
)

type Person struct {
    ID      int `gorm:"primary_key"`
    Name    string
    Parent  int
    Parent_ *Person `gorm:"foreignkey:parent"`
}

func (Person) TableName() string {
    return "go_person"
}

const (
    DB_ADAPTER  = "postgres"
    DB_HOST     = "localhost"
    DB_USER     = "postgres"
    DB_PASSWORD = "test"
    DB_NAME     = "test"
    DB_SSLMODE  = "disable"
)

func main() {
    db, err := gorm.Open(DB_ADAPTER, "host=" DB_HOST " user=" DB_USER " dbname=" DB_NAME " sslmode=disable" " password=" DB_PASSWORD "")
    if err != nil {
        panic("failed to open storage")
    }
    defer db.Close()
    db.AutoMigrate(amp;Person{})

    db.Delete(Person{})

    newManager := Person{
        Name    : "Manager 1",
    }
    db.Create(amp;newManager)

    managerID := newManager.ID

    newEmployee := Person{
        Name    : "Employee 1",
        Parent  : managerID,
    }
    db.Create(amp;newEmployee)

    newManager = Person{
        Name    : "Manager 2",
    }
    db.Create(amp;newManager)

    managerID = newManager.ID

    newEmployee = Person{
        Name    : "Employee 2",
        Parent  : managerID,
    }
    db.Create(amp;newEmployee)

    persons := []Person{}

    db.Preload("Parent_").Find(amp;persons)

    for _, person := range persons {
        fmt.Println("Name    :",person.Name)
        if person.Parent_ != nil {
            fmt.Println("Manager :",person.Parent_.Name)
        }
        fmt.Println("---------------------------------")
    }
}
  

В этом примере я ожидаю получить это в качестве результата:

 Name    : Manager 1
---------------------------------
Name    : Employee 1
Manager : Manager 1
---------------------------------
Name    : Manager 2
---------------------------------
Name    : Employee 2
Manager : Manager 2
---------------------------------
  

Но вместо этого я получил это:

 Name    : Manager 1
Manager : Employee 1
---------------------------------
Name    : Employee 1
---------------------------------
Name    : Manager 2
Manager : Employee 2
---------------------------------
Name    : Employee 2
---------------------------------
  

Почему?