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 關注
- 332 瀏覽
添加回答
舉報