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 而言,消息是一对一的关系。

当我必须首先遍历 Message 开始时,我无法考虑如何输出结果 Post。此代码正确输出消息,但我需要输出帖子。

{{#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>。我可以使用此语句在控制台中访问 Post 数据

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

它返回正确类型的对象。

那么,如何获取每条消息的 Post 数组?

4

2 回答 2

9

那么,如何获取每条消息的 Post 数组?

您可以通过每条消息的 posts 属性访问 post 数组。所以在车把中:

{{#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(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 []

现在使用 django-rest-framework 序列化程序来获取 REST api 设置

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();
  }
});

(无需在此处询问 m2m,因为 DjangoRESTAdapter 会处理给定上述端点的问题)

确实显示父级及其下的每个标签的车把模板(m2m 每个工作)

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