Если вы наклеивание с официальными привязками 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' в сообщении позволяет вам отображать пользователя, из которого он пришел, и сортировать выравнивание окна чата или все, что вы хотите сделать.
И наконец, индексирование как списка разговоров, которые когда-либо были у пользователя, так и индекса другого идентификатора пользователя в разговоре и идентификатора этой беседы. Таким образом, когда пользователь A отправляет сообщение пользователю B, вы можете выполнить вычисление findBy в индексе user_conversations. Если совпадение существует, начать разговор с разговором 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();
}
}
}
Удачи!
Действительно Nice anwser. Ты. – Scandinave