Создайте новую структуру и добавьте ее в массив в отношении один ко многим - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь добавить новый элемент в массив в отношении один ко многим. Проблема в том, что один из идентификаторов всегда не определен, а модель, которую я хочу добавить, не обновляется.

У меня есть следующие модели:

type Station struct {
    gorm.Model
    Name         string
    Measurements []Measurement
    PlantID      uint64
    Plant        Plant
}

type Measurement struct {
    ID             uint64 `gorm:"primary_key"`
    StationID      uint64
    TempSensor     float32
    LightSensor    float32
    HumiditySensor float32
    CreatedAt      time.Time
}

type Plant struct {
    gorm.Model
    Name string
}

Это маршрут, на который я отправляю почтовый запрос:

/stations/:id/measurements

Это текущий обработчик маршрута, который у меня есть:

func CreateMeasurement(c *gin.Context) {
    id := c.Params.ByName("id")
    var station Station
    if err := db.Where("id = ?", id).First(&station).Error; err != nil {
        c.AbortWithStatus(404)
        fmt.Println(err)
    } else {
        var measurement Measurement
        c.BindJSON(&measurement)

        // Convert params string to uint
        convertedID, err := strconv.ParseUint(id, 10, 64)
        if err != nil {
            fmt.Println(err)
        }
        measurement.StationID = convertedID

        db.Model(&station).Association("Measurements").Append(&measurement)
        db.Save(&station)
        c.JSON(200, station)
    }
}

Вопрос : Как создать новый элемент Measurement и добавить его к массиву []Measurement в конкретном Station, который указан параметрами маршрута?

1 Ответ

0 голосов
/ 04 ноября 2018

Решил проблему. Оказывается, возникла проблема с таблицей базы данных. Несмотря на то, что я включил автоматическую миграцию, возникла проблема с некоторыми идентификаторами, которые были нулевыми.

Вот рабочий маршрут:

func CreateMeasurement(c *gin.Context) {
    id := c.Params.ByName("id")
    var station Station
    if err := db.Where("id = ?", id).First(&station).Error; err != nil {
        c.AbortWithStatus(404)
        fmt.Println(err)
    } else {
        var measurement Measurement
        c.BindJSON(&measurement)

        db.Model(&station).Association("Measurements").Append(&measurement)
        c.JSON(200, station)
    }
}
...