2013-10-08 7 views
5

NDBを使用するGoogle App EngineプロジェクトでEmberJsとEmber-Dataを使用しています。データベースには、ホスト、プローブ、およびチェックのエンティティがあります。Emberデータネストされたモデル

class Host(ndb.Model): 
    hostName = ndb.StringProperty() 

hostKey = ndb.Key('Host', 'SomeHostId') 

class Probe(ndb.Model): 
    checkName = ndb.StringProperty() 

probeKey = ndb.Key('Host', 'SomeHostId', 'Probe', 'SomeProbeId') 

class Check(ndb.Model): 
    checkName = ndb.StringProperty() 

checkKey = ndb.Key('Host', 'SomeHostId', 'Probe', 'SomeProbeId', 'Check', 'SomeCheckId') 

私は、各ホストは、いくつかのプローブを持っていることを示すためにキーを追加しました:データベースモデルではなく、実際問題として、長い間、私は順番に私のREST APIを持っているとしてではなく、明確にするために、私のデータベースクラスしているここにありませんそれぞれのプローブはいくつかのチェックを行います。私App.Jsで

  • ホスト
    • プローブ
      • チェック

私は、次のモデルを定義している:

App.Host = DS.Model.extend({ 
    hostName: DS.attr('string') 
    probes: DS.hasMany('probe',{async:true}) 
}); 

App.Probe = DS.Model.extend({ 
    host: DS.belongsTo('host'), 
    probeName: DS.attr('string') 
    checks: DS.hasMany('check',{async:true}) 
}); 

App.Check = DS.Model.extend({ 
    probe: DS.belongsTo('probe'), 
    hostName: DS.attr('string') 
}); 

私は、次のルータを定義している:

app = webapp2.WSGIApplication([ 
    ('/', MainHandler), 
    webapp2.Route('/hosts', HostsHandler), 
    webapp2.Route('/hosts/<hostId>/', HostHandler), 
    webapp2.Route('/hosts/<hostId>/probes', ProbesHandler), 
    webapp2.Route('/hosts/<hostId>/probes/<probeId>/checks', ChecksHandler), 
    webapp2.Route('/hosts/<hostId>/probes/<probeId>/checks/<checkId>/', CheckHandler) 
]) 

http://example.com/hostsリターン:

{ 
    "hosts": [ 
     { 
      "hostName": "SomeHostName1", 
      "id": "SomeHostId1" 
     }, 
     { 
      "hostName": "SomeHostName2", 
      "id": "SomeHostId2" 
     } 
    ] 
} 

http://example.com/hosts/SomeHostId1/probesリターン:

App.Router.map(function() { 
    this.resource('hosts', function(){ 
     this.resource('host', { path:':host_id'}, function(){ 
      this.resource('probes', function(){ 
       this.resource('probe', { path:':probe_id'}, function(){ 
        this.resource('checks', function(){ 
         this.resource('check', { path:':check_id'}, function(){ 

         }); 
        }); 
       }); 
      }); 
     }); 
    }); 
}); 

そして、次のURLパスを構築した場合のAppEngineで

{ 
    "probes": [ 
     { 
      "probeName": "SomeProbeName1", 
      "id": "SomeProbeId1", 
      "host_id": "SomeHostId1" 
     }, 
     { 
      "probeName": "SomeProbeName2", 
      "id": "SomeProbeId2", 
      "host_id": "SomeHostId1" 
     } 
    ] 
} 

http://example.com/hosts/SomeHostId1/probes/SomeProbeId1/checksリターン:

{ 
    "checks": [ 
     { 
      "checkName": "SomeCheckName1", 
      "id": "SomeCheckId1", 
      "probe_id": "SomeProbeId1" 
     }, 
     { 
      "checkName": "SomeCheckName2", 
      "id": "SomeCheckId2", 
      "probe_id": "SomeProbeId1" 
     } 
    ] 
} 

私のテンプレートがありません。今、私はこのすべてを持っている

<script type="text/x-handlebars" id="host"> 
    <h3>{{hostName}}</h3> 
    {{#link-to 'probes' probes}}probes{{/link-to}} 

    {{outlet}} 
</script> 

<script type="text/x-handlebars" id="probes"> 
    {{#each probe in probes}} 
    Probe: {{probe.probeName}} 
    {{#link-to 'checks' probe.checks}}checks{{/link-to}} 
    {{/each}} 

    {{outlet}} 
</script> 

<script type="text/x-handlebars" id="checks"> 
    {{#each check in checks}} 
    Check: {{check.checkName}} 
    {{/each}} 
</script> 

...しかしエンバー・データは、右のhttpを作るようにそれを一緒にタイアップする方法見当もつかないリクエスト。これまでのところ、私はリクエストを見ただけですhttp://example.com/modelName/

答えて

3

現在、Ember Dataはこの種のネストされたAPIエンドポイントのルートをサポートしていません。これについていくつかの話がありましたが、それは進歩を遂げているようには見えません。

+0

埋め込みレコードとネストされたAPIルートは、全く異なる2つのものです。 –

+0

私は、この質問に最初にいくつかのビューを取得し、あなたの答えを受け入れるよ。私は賞金を加えてもっと注意を喚起した。うまくいけばそれは助ける;) –

+2

2年後の更新? – Joe

3

私は、Appエンジンについては何も知りませんが、あなたは、このような設定を得ることができれば、燃えさしデータ休息アダプタの

app = webapp2.WSGIApplication([ 
    ('/', MainHandler), 
    webapp2.Route('/hosts', HostsHandler), 
    webapp2.Route('/hosts/<hostId>', HostHandler), 
    webapp2.Route('/probes', ProbesHandler), 
    webapp2.Route('/probes/<probeId>', ProbesHandler), 
    webapp2.Route('/checks/', CheckHandler) 
    webapp2.Route('/checks/<checkId>/', CheckHandler) 
]) 

そしてhttp://example.com/hostsに対する応答はJSON配列ホストを返す必要があります:[ {}、{}}とhttp://example.com/hosts/1のホストオブジェクトホストを表すjson:{}と他のAppEngineルートと同じもの

+0

すべての小切手を一度に読み込むことは悪い考えかもしれません。わかりやすくするために、1レベルの入れ子(checkDataItems)を使いました。私は、1000以上のホストが15以上のチェックを実行している1+プローブを実行している状況があります。各チェックには1〜20個のデータ項目があります。 私はチェックを受けるだけでOKになるかもしれません。しかし、私は、checkDataItemsを一度に読み込むとしばらく時間がかかるかもしれません。 –

+1

クエリにparamsを追加し、store.findQuery( 'check'、{probe_id: "1"}))などのようにhttp://example.com/checks?probe_id=1をクリックしてください。ルートモデルフック – Edu

+0

そう、それは私のバックアップ実装でした。 –

2

あなたはホストモデルを2回定義しました。私は残り火にかなり新しいですし、非同期使用していない:真の特徴が、私は(私は、ネストされたルートを使用していなかった)のようなことを行うことができた:

App.Host = DS.Model.extend({ 
    hostName: DS.attr('string') 
    probes: DS.hasMany('probe') 
}); 

App.Probe = DS.Model.extend({ 
    probeName: DS.attr('string') 
    checks: DS.hasMany('check') 
}); 

App.Check = DS.Model.extend({ 
    checkName: DS.attr('string') 
}); 

と休息をスピンアップすることができます返すホストのためのAPI:

{ 
    "hosts": [ 
     { 
      "hostName": "SomeHostName1", 
      "id": "SomeHostId1", 
      "probes":["p1","p2"] 
     }, 
     { 
      "hostName": "SomeHostName2", 
      "id": "SomeHostId2", 
      "probes":["p2","p3"] 
     } 
    ], 
    "probes": [ 
     { 
      "probeName": "SomeProbeName1", 
      "id": "p1", 
      "checks":["c1","c2"] 
     }, 
     { 
      "probeName": "SomeProbeName2", 
      "id": "p2", 
      "checks":["c2","c3"] 
     } 
    ], 
    "checks": [ 
     { 
      "checkName": "SomeCheckName1", 
      "id": "c1" 
     }, 
     { 
      "checkName": "SomeCheckName2", 
      "id": "c2" 
     } 
    ] 
} 

を私の場合は、ルートを入れ子になっていませんでしたが、私は必要なすべてのコンテンツがすでに店舗にあるので、我々は何とかマスターペイロードからコントローラの内容を設定することができるはずだと思います!私はそれが何か助けであったかどうかわかりませんが、これはまた、私がその答えを知りたいと思うものです。

+0

子エンティティのIDを追加すると、Googleのデータストアで結合を行うことはできないので、2番目のデータベースクエリが必要になります。しかし、私はidプロパティを尋ねているだけなので、2番目のクエリを実行しても問題ないと思います。 –

+0

PSあなたは正しかった、それは小切手モデルだったはずです。私は今投稿を更新しました:) –

+0

私はあなたの答えで同じことをしようとしていますが、私はまだコードを実行していません...コントローラはこのように見えますか?コントローラは1つのモデルクラス(単一のオブジェクトまたは同じタイプのリストのいずれか)を表しているに過ぎません – Anentropic

関連する問題