我有一个后记数据库,它将JSON存储为其字段之一。该表的结构为:type Table struct { ID int VehicleType string Vehicle Vehicle `gorm:"type:jsonb"`// ...... }现在,车辆是一个界面type Vehicle interface { GetEngineModel() string}它有很多实现,我将分享其中之一 - 汽车type Car struct { CarEngineModel string //the attributes will be different for different //implementation}func (car Car) GetEngineModel() string { return car.CarEngineModel}为了解析特定结构(即汽车,自行车,..)中的属性,我可以实现所有实现的扫描和值接口,如下所示:-func (car *Car) Scan(value interface{}) error { //Want to use this implementation of Scan based on VehicleType //attribute of struct table b, ok := value.([]byte) if !ok { return errors.New("type assertion to []byte failed") } *car = json.Unmarshal(b, &car)}有没有办法根据其他表列来判断要使用哪种扫描实现,或者使用GORM的另一种方法来做同样的事情?我只想要一个表(遗传json类型),所以不想使用不同的表来使用多态关联的不同实现。去戈姆
1 回答
猛跑小猪
TA贡献1858条经验 获得超8个赞
您可以添加一个单独的字段来保存原始 JSON 数据,然后实现特定的挂钩来封送/取消封送该数据。gorm
type Table struct {
ID int
VehicleType string
Vehicle Vehicle `gorm:"-"`
// ...
VehicleRaw []byte `gorm:"column:vehicle"`
}
func (t *Table) BeforeSave(tx *gorm.DB) (err error) {
raw, err := json.Marshal(t.Vehicle)
if err != nil {
return err
}
t.VehicleRaw = raw
return nil
}
func (t *Table) AfterFind(tx *gorm.DB) (err error) {
switch t.VehicleType {
case "CAR":
t.Vehicle = &Car{}
case "BIKE":
t.Vehicle = &Bike{}
}
return json.Unmarshal(t.VehicleRaw, t.Vehicle)
}
- 1 回答
- 0 关注
- 79 浏览
添加回答
举报
0/150
提交
取消