diff --git a/orm/models_test.go b/orm/models_test.go index 3fed1a9b..706f04dc 100644 --- a/orm/models_test.go +++ b/orm/models_test.go @@ -1,6 +1,7 @@ package orm import ( + "encoding/json" "fmt" "os" "strings" @@ -11,7 +12,7 @@ import ( _ "github.com/mattn/go-sqlite3" ) -// A true/false field. +// A slice string field. type SliceStringField []string func (e SliceStringField) Value() []string { @@ -57,10 +58,39 @@ func (e *SliceStringField) RawValue() interface{} { return e.String() } -func (e *SliceStringField) Clean() error { +var _ Fielder = new(SliceStringField) + +// A json field. +type JsonField struct { + Name string + Data string +} + +func (e *JsonField) String() string { + data, _ := json.Marshal(e) + return string(data) +} + +func (e *JsonField) FieldType() int { + return TypeTextField +} + +func (e *JsonField) SetRaw(value interface{}) error { + switch d := value.(type) { + case string: + return json.Unmarshal([]byte(d), e) + default: + return fmt.Errorf(" unknown value `%v`", value) + } return nil } +func (e *JsonField) RawValue() interface{} { + return e.String() +} + +var _ Fielder = new(JsonField) + type Data struct { Id int Boolean bool @@ -130,6 +160,7 @@ type User struct { ShouldSkip string `orm:"-"` Nums int Langs SliceStringField `orm:"size(100)"` + Extra JsonField `orm:"type(text)"` } func (u *User) TableIndex() [][]string { diff --git a/orm/orm_test.go b/orm/orm_test.go index 917e031f..40fcb1c6 100644 --- a/orm/orm_test.go +++ b/orm/orm_test.go @@ -478,7 +478,9 @@ func TestCustomField(t *testing.T) { throwFailNow(t, err) user.Langs = append(user.Langs, "zh-CN", "en-US") - _, err = dORM.Update(&user, "Langs") + user.Extra.Name = "beego" + user.Extra.Data = "orm" + _, err = dORM.Update(&user, "Langs", "Extra") throwFailNow(t, err) user = User{Id: 2} @@ -487,6 +489,9 @@ func TestCustomField(t *testing.T) { throwFailNow(t, AssertIs(len(user.Langs), 2)) throwFailNow(t, AssertIs(user.Langs[0], "zh-CN")) throwFailNow(t, AssertIs(user.Langs[1], "en-US")) + + throwFailNow(t, AssertIs(user.Extra.Name, "beego")) + throwFailNow(t, AssertIs(user.Extra.Data, "orm")) } func TestExpr(t *testing.T) {