3

私たちは、ユーザーが多くのソーシャルメディアアカウントにメッセージを送信できるようにするメッセージングシステムに取り組んでいます。これにより、各アカウントに投稿が行われます。私たちのアプリケーションには、アカウント、メッセージ、投稿があります。メッセージは私のコンテンツの単一のインスタンスであり、投稿として送信できます。

アカウントには多くのメッセージを含めることができます。

メッセージは多くのアカウントに関連付けることができます。メッセージには多くの投稿を含めることができます。

投稿はメッセージに属します。

次のようにデータをモデル化します。

Social.Account = DS.Model.extend({
    username: DS.attr('string'),
    messages: DS.hasMany('Social.Message')
});

Social.Message = DS.Model.extend({
    user_id: DS.attr('number'),
    text: DS.attr('string'),
    accounts: DS.hasMany('Social.Account'),
    posts: DS.hasMany('Social.Post')
});

Social.Post = DS.Model.extend({
    created: DS.attr('date'),
    text: DS.attr('string'),
    message: DS.belongsTo('Social.Message')
});

FIXTUREデータは次のようになります。

Social.Account.FIXTURES = [{
    id: 1,
    username: "commadelimited",
    messages: [1, 2]
}];

Social.Message.FIXTURES = [{
    id: 1,
    user_id: 1,
    text: 'This is message #1 sent by account #1',
    accounts: [1],
    posts: [1]
}, {
    id: 2,
    user_id: 1,
    text: 'This is message #2 sent by account #1',
    accounts: [1],
    posts: [2]
}];

Social.Post.FIXTURES = [{
    id: 1,
    created: "5 minutes ago",
    text: 'This is post #1 sent by account #1, tied to message #1'
}, {
    id: 1,
    created: "5 minutes ago",
    text: 'This is post #2 sent by account #1, tied to message #2'
}];

私たちのシステムでは、メッセージは人の投稿になる可能性がありますが、UIに関する限り、メッセージは1対1の関係です。

最初にメッセージをループすることから始めなければならないときに、結果の投稿を出力する方法を考えるのに苦労しています。このコードはメッセージを正しく出力しますが、代わりに投稿を出力する必要があります。

{{#each messages in messages}}
    <article>
        <time>{{post.ts}}</time>
        <div class="post-content">
            <h2>{{post.text}}</h2>
        </div>
    </article>
{{/each}}

私は試しましたが{{#each messages in messages.posts}}、それは何もありません。{{message}}各ループ内で、を返すループ内で出力しました<Social.Message:ember391:1>。このステートメントを使用して、コンソールの投稿データにアクセスできます

Social.Account.find().objectAt(0).get('messages').objectAt(0).get('posts')

これは正しいタイプのオブジェクトを返します。

では、各メッセージのPost配列を取得するにはどうすればよいですか?

4

2 に答える 2

9

では、各メッセージの Post 配列を取得するにはどうすればよいでしょうか?

各メッセージの posts プロパティを介して投稿配列にアクセスできます。ハンドルバーでは:

{{#each message in messages}}
  <p>Message: {{message}}</p>
  <p>Message posts: {{message.posts}}</p>
  {{#each post in message.posts}}
    <article>
        <time>{{post.ts}}</time>
        <div class="post-content">
            <h2>{{post.text}}</h2>
        </div>
    </article>
  {{/each}}
{{/each}}
于 2013-02-27T23:36:35.620 に答える
2

私の例はあなたが望むよりも少し「完成」しているかもしれませんが、あなたがdjangoバックエンドで作業していることを知っているので...ここにm2mセットアップ全体があります(ember.jsとdjango-rest-frameworkを使用)

最初に - django モデル

class Tag(models.Model):
    description = models.CharField(max_length=200)

class Session(models.Model):
    name = models.CharField(max_length=150)
    tags = models.ManyToManyField(Tag)

基本的な「すべてを検索」および「各タグを検索」URL

url(r'^/sessions/$', views.SessionList.as_view()),
url(r'^/sessions/(?P<session_pk>\d+)/tags/$', views.TagBySessionList.as_view()),

django ビュー (必要に応じて django-rest-framework を有効にします)

from rest_framework import generics
class SessionList(generics.ListCreateAPIView):
    model = Session
    serializer_class = SessionSerializer

class TagBySessionList(generics.ListCreateAPIView):
    model = Tag
    serializer_class = TagSerializer

    def get_queryset(self):
        session_pk = self.kwargs.get('session_pk', None)
        if session_pk is not None:
            return Tag.objects.filter(session__pk=session_pk)
        return []

REST API セットアップを取得するための django-rest-framework シリアライザー

from rest_framework import serializers
class SessionSerializer(serializers.ModelSerializer):
    tags = serializers.ManyPrimaryKeyRelatedField()

    class Meta:
        model = Session
        fields = ('id', 'name', 'tags')

class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag
        fields = ('id', 'description')

次は - ember-data モデル (注 - ここにはフィクスチャ アダプタはなく、実際の REST API 呼び出し)

CodeCamp.Session = DS.Model.extend({
  name: DS.attr('string'),
  tags: DS.hasMany('CodeCamp.Tag')
});

CodeCamp.Tag = DS.Model.extend({
  description: DS.attr('string')
});

親要素を単純にロードするルート要素 (基本的なすべて検索)

CodeCamp.SessionsRoute = Ember.Route.extend({
  model: function() {
      return CodeCamp.Session.find();
  }
});

(上記のエンドポイントを指定すると、DjangoRESTAdapter がそれを処理するため、ここで m2m を要求する必要はありません)

親とその下の各タグを表示するハンドルバー テンプレート (m2m 各作業)

{{#each session in controller}}
  {{session.name}}<br />
  {{#each tag in session.tags}}
    {{tag.description}}<br />
  {{/each}}
{{/each}}
于 2013-02-28T02:04:08.420 に答える