为了账号安全,请及时绑定邮箱和手机立即绑定

将接口设置为具有许多使用 GORM 的实现的属性

将接口设置为具有许多使用 GORM 的实现的属性

Go
海绵宝宝撒 2022-09-12 21:01:07
我有一个后记数据库,它将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)

}


查看完整回答
反对 回复 2022-09-12
  • 1 回答
  • 0 关注
  • 79 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信