3

我尝试建立一个简单的聊天。用户可以选择另一个与之交谈。我将 Ember 与 Firebase 一起使用。我已经建立了我的模型,例如 firebase 示例。

这是我的简单模型。用户模型:

import DS from "ember-data";

var user = DS.Model.extend({
    name : DS.attr('string'),
    messages : DS.hasMany("message", {async : true, inverse : 'owner'})
});

export default user;

消息模型:

import DS from "ember-data";

var message = DS.Model.extend({
    date : DS.attr('date'),
    content : DS.attr('string'),
    owner : DS.belongsTo('user', {async : true}),
    target: DS.belongsTo('user', {async : true})
});

export default message;

Emberfire 不支持“findQuery”余烬数据类型搜索,那么我如何检索属于对话的所有消息?这是定义我的模型的正确方法还是有另一种方法?在理想情况下,我只想用一个请求检索所有消息。(从所有者到目标,从目标到所有者)

4

1 回答 1

4

如果您坚持使用官方的 emberfire 绑定,则可以设置三个模型:

用户:

var user = DS.Model.extend({
    name          : DS.attr('string'),
    conversations : DS.hasMany('conversation', { async: true }),
    convos_users  : DS.hasMany('convo_user', { embedded: true })
});

对话:

var conversation = DS.Model.extend({
    messages : DS.hasMany('message', { embedded: true })
});

信息:

var message = DS.Model.extend({
    date    : DS.attr('date'),
    content : DS.attr('string'),
    from    : DS.belongsTo('user', { async : true })
});

然后设置嵌入式 convos_users 索引:

var convos_users = DS.Model.extend({
    with         : DS.belongsTo('user', {async : true}),
    conversation : DS.belongsTo('conversation', { async: true })
});

因此,生成的架构在 firebase 中看起来像这样:

{
  'users': {
    'user_1': {
      'name': 'Terrance',
      'conversations': {
        'convo_1': true
      },
      'convo_users': {
        0: {
          'with': 'user_2',
          'conversation': 'convo_1'
        },
        ...
      }
    },
    'user_2': {
      'name': 'Phillip',
      'conversations': {
        'convo_1': true
      },
      'convo_users': {
        0: {
          'with': 'user_1',
          'conversation': 'convo_1'
        },
        ...
      }
    },
    ...
  },

  'conversations': {
    'convo_1': {
      'messages': {
        0: {
          'date': 123456789,
          'content': 'Hey buddy!',
          'from': 'user_1'
        },
        1: {
          'date': 123456789,
          'content': 'Hey guy!',
          'from': 'user_2'
        },
        ...
      }
    }
  }
}

此设置允许您将消息一起嵌入到一个公共对话线程中,因此您只检索您想要查看的对话的消息。消息中的 'from' 属性可让您呈现它来自的用户,并对聊天窗口的对齐方式或您想要做的任何事情进行排序。

最后,索引用户曾经参与过的对话列表,以及对话中另一个用户 ID 和该对话 ID 的索引。这样,当用户 A 去向用户 B 发送消息时,您可以在 'user_conversations' 索引上执行计算的 findBy。如果存在匹配项,则使用找到的对话 ID 打开对话,并将消息附加到对话的嵌入消息数组中:

actions: {
  sendMessage: function(msg) {
    var userX = this.current_user.get('convos_users').findBy('with','user_X');

    // No User
    if (!userX) {
      // 1. Create a new Conversation (var myRoom)
      // 2. Save room id to users
      // 3. Save room to your conversations model list
    }

    // Else
    myRoom.messages.pushObject(msg);
    myRoom.save();
  }
}

}

祝你好运!

于 2014-12-16T13:54:38.057 回答