Ответ 1
Единственными типами, допустимыми для полей текущей версии Go AppEngine SDK, являются следующим образом:
- целые числа со знаком (int, int8, int16, int32 и int64),
- BOOL,
- строка,
- float32 и float64,
- любой тип, базовый тип которого является одним из вышеуказанных предопределенных типов,
- * Key,
- appengine.BlobKey,
- [] byte (до 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
}