Gorm (Golang) и база данных со столбцом типа «Наследование отдельных таблиц» - PullRequest
3 голосов
/ 25 апреля 2019

Я экспериментирую с использованием Go для чтения из базы данных, которая была частью существующего приложения Rails. Несколько моделей и, следовательно, таблиц используют наследование одной таблицы через столбец type. В Rails / ActiveRecord наличие этого столбца создаст автоматическое сопоставление с соответствующей моделью. Если таблица animals и type равна Dog, она будет сопоставлена ​​с классом Dog; если это Cat, он будет сопоставлен с классом Cat. Я хочу настроить нечто подобное в Gorm.

Поскольку не похоже, что у Горм есть опция default_scope для модели, я использую новый обратный вызов.

func scopedSearch(scope *gorm.Scope) {
    tablename := scope.TableName()
    switch tablename {
    case "table_using_sti":
        scope.Search.Where("type = ?", "MyModelName")
    default:
        return
    }
}

И затем я регистрирую обратный вызов в моей функции main:

db.Callback().Query().Before("gorm:query").Register("my_plugin:before_query", scopedSearch)

Когда я выполняю поиск по экземпляру, используя db.First, или по модели, использующей db.Model(&MyModel{}).Where(...), он работает. Это правильный способ справиться с этим? Будет ли эта область соблюдаться всеми методами запросов или есть что-то более прямое или тщательное?

...