Я экспериментирую с использованием 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(...)
, он работает. Это правильный способ справиться с этим? Будет ли эта область соблюдаться всеми методами запросов или есть что-то более прямое или тщательное?