Create empty slice when records are not found.

There is a gotcha in golang (go figure!) resulting from the
difference between a nil slice and an empty slice. While the length
of both are 0, the JSON encoder will interpret the nil slice as
'null' and the empty slice as '[]'. Other libraries (i.e. ActiveRecord)
will return an empty array when no values are found. I have found
that this translates into better client-side code, since you don't
have to protect against null arrays.

See 'http://danott.co/posts/json-marshalling-empty-slices-to-empty-arrays-in-go.html'
for more information.
This commit is contained in:
jnfeinstein 2014-11-22 01:43:47 -08:00
parent 84954e6779
commit 0d6f01d340
2 changed files with 23 additions and 0 deletions

View File

@ -77,6 +77,15 @@ func Query(scope *Scope) {
}
if !anyRecordFound {
if isSlice && dest.IsNil() {
var emptySliceType reflect.Type
if isPtr {
emptySliceType = reflect.SliceOf(reflect.PtrTo(destType))
} else {
emptySliceType = reflect.SliceOf(destType)
}
dest.Set(reflect.MakeSlice(emptySliceType, 0, 0))
}
scope.Err(RecordNotFound)
}
}

View File

@ -78,6 +78,20 @@ func TestFindAsSliceOfPointers(t *testing.T) {
}
}
func TestFindWontReturnNilSlices(t *testing.T) {
randomNum := rand.Intn(1000000000)
var users []User
DB.Where("name = ?", randomNum).Find(&users)
var userPointers []*User
DB.Where("name = ?", randomNum).Find(&userPointers)
if reflect.ValueOf(users).IsNil() || reflect.ValueOf(userPointers).IsNil() {
t.Errorf("Should have returned empty slices")
}
}
func TestSearchWithPlainSQL(t *testing.T) {
user1 := User{Name: "PlainSqlUser1", Age: 1, Birthday: now.MustParse("2000-1-1")}
user2 := User{Name: "PlainSqlUser2", Age: 10, Birthday: now.MustParse("2010-1-1")}