2014-12-14 3 views
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

Если вы наклеивание с официальными привязками 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(); 
    } 
} 

}

Удачи!

+0

Действительно Nice anwser. Ты. – Scandinave

Смежные вопросы