1 回答

TA贡献1804条经验 获得超8个赞
我找不到有关如何实现它的任何信息。经过大量调试后,我能够让它工作,所以发布我的解决方案。
简短的回答:
嵌套切片必须是指针数组
以这种方式定义您的嵌套/子结构
creditCardStruct := dynamicstruct.NewStruct().
AddField("Bank", "", `protobuf:"bytes,1,opt,name=number,proto3" json:"bank,omitempty" gorm:"column:bank;not null"`).
AddField("Number", "", `protobuf:"bytes,1,opt,name=number,proto3" json:"number,omitempty" gorm:"column:number;not null;size:16;primary_key"`).
AddField("Cvv", "", `protobuf:"bytes,2,opt,name=cvv,proto3" json:"cvv,omitempty" gorm:"column:cvv;not null;size:5" skyflow:"only4digits"`).
//AddField("Expiry", timeNow, `protobuf:"bytes,3,opt,name=expiry,proto3" json:"expiry,omitempty" gorm:"column:expiry;type:timestamp;not null;"`).
AddField("Name", "", `protobuf:"bytes,1,opt,name=number,proto3" json:"name,omitempty" gorm:"column:name;not null"`).
AddField("ProfileID", "", `protobuf:"bytes,5,opt,name=userName,proto3" json:"profile_id,omitempty" sql:"type:string REFERENCES user_normalized1(profile_id)" gorm:"column:profile_id;not null;primary_key"`).
Build().New()
creditCardArrayInstance := reflect.New(reflect.SliceOf(reflect.TypeOf(creditCardStruct))).Elem().Interface()
userInstance := dynamicstruct.NewStruct().
AddField("ProfileID", "", `protobuf:"bytes,1,opt,name=number,proto3" json:"profile_id,omitempty" gorm:"column:profile_id;unique;not null;unique_index;primary_key"`).
AddField("CreditCards", creditCardArrayInstance, `protobuf:"bytes,1,opt,name=number,proto3" json:"credit_cards,omitempty" gorm:"foreignkey:ProfileID;association_foreignkey:ProfileID"`).
Build().
New()
db.Table("user_normalized1").AutoMigrate(userInstance)
db.Table("credit_card1").AutoMigrate(creditCardStruct)
长答案:
当 DynamicStruct 创建一个Slice of Struct时,它正在创建一个 slice 的指针
reflect.New(reflect.SliceOf(ds.definition)).Interface()
。这实际上是一个指向切片的指针。因此,而不是[]*CreditCards
This 成为*[]*CreditCards
当 gorm 执行回调以保存关联时,它有一个单独的块用于处理切片,标识的运行时类型不是切片(它是指针)。所以它假设它是结构体并继续将它作为一个简单的结构体来处理。
但是,当 gorm从 scope 构建字段时,对于非结构字段(如切片),它不会设置字段定义。因此,当 gorm 将前一个切片作为普通结构处理时,它的字段是 Invalid 类型,因为它从未设置过。
所以解决方案是手动创建动态结构作为指针数组,而不是提供的NewSliceOfStructs
API。
- 1 回答
- 0 关注
- 342 浏览
添加回答
举报