2012-04-30 2 views
2

結果>移動)のAppEngine>マッピングデータストアは、私がquery.GetAll(でretreived結果をマップしようとしている

テンプレートは、各エンティティに関連付けられたデータストア「キー」を必要になりますので、私は結果をマッピングする必要があります。

// Query 
q := datastore.NewQuery("Article").Limit(10) 
// Define array where the entities will be retreived 
var a[] Article; 
// Retreive entities 
key, _ := q.GetAll(c, &a) 
// Create an empty map 
article := map[string] Article{} 
// Build the map 
for k := range a { 
    article[key[k].Encode()] = a[k]; 
} 
template.Execute(w, map[string]interface{} { "Articles" : article}) 

直接配列を作成するのでquery.GetAll()を使用して、マップ、オーバーマップやループを構築するためのより効率的な方法があります:私は次のことをやっている時点では

マップを構築するための配列は賢明ではないようですか?

または、各エンティティに関連付けられたデータストアキー(エンコード)を取得する効率的な方法はありますか?

+0

を呼ぶだろうか? –

答えて

0

私はマップが必要ないと思います。私が理解すれば、GetAllの後に、あなたは2つの平行なスライス、keyとaを持っています。 (私はGAEを知らないが、_は眉を上げる。それはあなたが確認すべきものか?)テンプレートは並列配列を扱うことができる。レンジアクションが2つの結果、値、およびインデックスを返す方法をドキュメントで参照してください。 1つのスライスを範囲とし、そのインデックスを使用して他のスライスから対応する値を取得できるようにする必要があります。より複雑なテンプレートになりますが、マップを避けるべきです。

編集:申し訳ありませんが、私はこれを行う方法を知っていたと思っていましたが、例を記述しようとすると失敗しました。他の誰かがこれを行う方法を知っている場合は、ここに残しておきます。それ以外の場合は、downvote ...

1

おそらく、スライスを単一のスライスに圧縮するのが最善でしょう。これらの線に沿って、

package main 

import (
    "os" 
    "text/template" 
) 

type pair struct { 
    Key  string 
    Article string 
} 

var tmpt = `Here's the list:{{range $p := .}} 
    {{$p.Key}}: {{$p.Article}}{{end}} 
` 

func main() { 
    list := template.Must(template.New("list").Parse(tmpt)) 
    // query 
    key := []string{"banana", "donkey", "curious"} 
    a := []string{"long fruit", "who needs one?", "human nature"} 
    // zip 
    pairs := make([]pair, len(key)) 
    for i, k := range key { 
     pairs[i].Key = k 
     pairs[i].Article = a[i] 
    } 
    // execute on zipped list 
    if err := list.Execute(os.Stdout, pairs); err != nil { 
     os.Stdout.WriteString(err.Error()) 
    } 
} 

出力:

 
Here's the list: 
     banana: long fruit 
     donkey: who needs one? 
     curious: human nature 
0

たぶん、あなたはArticleKeyを埋め込むことができます。あなたはまだ記事とキーをループする必要がありますが、少なくとも別のマップを作成する必要はありません。

type Article struct { 
    // Add a key to the struct, but prevent it from being saved to the datastore. 
    Key datastore.Key `datastore:"-"` 
} 

// Query 
q := datastore.NewQuery("Article").Limit(10) 
// Define array where the entities will be retreived 
var a[] Article 
// Retreive entities 
key, _ := q.GetAll(c, &a) 

// Loop through the articles adding the key as you go. 
for i := range a { 
    a[i].Key = key[i] 
} 
template.Execute(w, map[string]interface{} { "Articles" : a}) 

は、その後、あなたのテンプレートで、あなたはあなたがこれを理解しましたarticle.Key.Encode

関連する問題