Для полей в текущей версии Go AppEngine SDK допустимы только следующие типы: : :
- целые числа со знаком (int, int8, int16, int32 и int64),
- BOOL
- строка
- float32 и float64,
- любой тип, базовый тип которого является одним из указанных выше объявленных типов,
- * Key
- appengine.BlobKey
- [] байт (длиной до 1 мегабайта),
- ломтики любого из вышеперечисленных (до 100 элементов в длину).
Учитывая это, кажется, есть два способа сделать это. Одним из них является сохранение части ключей, чтобы указать на голоса данного комментария. Однако это может привести к ограничению в 100 элементов для любого достаточно популярного комментария.
Другой подход заключается в сохранении «указателя» на комментарий в каждой структуре голосования, например:
type Vote struct {
User string
Score int
CommentKey *datastore.Key
}
type Comment struct {
Author string
Content string
Date datastore.Time
}
Затем, когда вы отправите запрос, вам нужно сделать это в два шага. Сначала вы получите комментарий, который вас интересует (в данном случае только первый, который был возвращен). Во-вторых, вы запрашиваете все голоса, которые «указывают» на этот комментарий:
q := datastore.NewQuery("Comment").Limit(1)
comments := make([]Comment, 0, 1)
var err os.Error
var keys []*datastore.Key
if keys, err = q.GetAll(c, &comments); err != nil {
// handle the error
}
comment := comments[0]
vq := datastore.NewQuery("Vote").Filter("CommentKey=", keys[0])
votes := make([]Vote, 0, 10)
if _, err := vq.GetAll(c, &votes); err != nil {
// handle the error
}