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

我有一个后记数据库,它将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类型),所以不想使用不同的表来使用多态关联的不同实现。


戈姆


海绵宝宝撒
浏览 80回答 1
1回答

猛跑小猪

您可以添加一个单独的字段来保存原始 JSON 数据,然后实现特定的挂钩来封送/取消封送该数据。gormtype 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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go