If you're sticking with the official emberfire bindings, you can set up three models:
User:
var user = DS.Model.extend({
name : DS.attr('string'),
conversations : DS.hasMany('conversation', { async: true }),
convos_users : DS.hasMany('convo_user', { embedded: true })
});
Conversation:
var conversation = DS.Model.extend({
messages : DS.hasMany('message', { embedded: true })
});
Message:
var message = DS.Model.extend({
date : DS.attr('date'),
content : DS.attr('string'),
from : DS.belongsTo('user', { async : true })
});
And then set up the embedded convos_users index:
var convos_users = DS.Model.extend({
with : DS.belongsTo('user', {async : true}),
conversation : DS.belongsTo('conversation', { async: true })
});
So the resulting schema looks something like this in 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'
},
...
}
}
}
}
This setup lets you embed messages together in a common conversation thread, so you only retrieve the messages for the conversation you want to see. The 'from' attribute in the message lets you render the user that it came from, and sort the alignment of the chat window, or whatever you're looking to do.
Finally, indexing both the list of conversations the user has ever been in, along with an index of the other user id in the conversation and that conversation's ID. This way, when user A goes to send a message to user B, you can do a computed findBy on the 'user_conversations' index. If a match exists, open the conversation with the conversation ID found, and append the messages to the conversation's embedded message array:
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();
}
}
}
Good luck!