2015-04-24 2 views
1

Я создаю приложение на основе чата, которое позволяет пользователям просматривать историю сообщений, отправлять новые сообщения и выбирать из последних пользователей. Список последних пользователей сортируется с помощью атрибута recent_rating, который является датой последнего отправленного/полученного сообщения, связанного с этим пользователем. recent_rating не является атрибутом в базе данных, а метод объявляется в пользовательской модели. Пользователи мы заказывают правильно, когда я загрузить страницу в первый раз со следующей настройкой в ​​моем коде:Как обновить запись локально с помощью Ember-Data и Ember?

Serializer:

class UserSerializer < ActiveModel::Serializer 
    attributes :id, :email, :name, :recent_rating 
end 

Rails модель:

def recent_rating 
     Message.where('recipient_id = :user_id OR sender_id = :user_id', user_id: id).last.try(:created_at) 
    end 

Ember контроллер:

App.ChatsController = Ember.ArrayController.extend(
{ 
    sortProperties: ['recent_rating'], 
    sortAscending: false, 

    .... 
}); 

Ember модель:

App.User = DS.Model.extend(
{ 
    name: DS.attr('string'), 
    email: DS.attr('string'), 
    recent_rating: DS.attr('string'), 
}); 

Однако, когда я отправляю новое сообщение, мне нужно обновить атрибут recent_rating в локальном хранилище данных ember для соответствующей записи пользователя. Это, в свою очередь, обновит список заказов для последних пользователей.

Как обновить атрибут записи в Ember-Data и избежать запроса POST API? Как recent_rating не существует в качестве атрибута в базе данных на стороне API

Благодарности

+0

Модель не должна сохраняться на сервере до тех пор, пока на ней не будет вызвано сохранение, как вы обновляете запись? – Jakeii

ответ

0

Существует технический способ сделать то, что вы просите (store#push), но я думаю, что дизайн немного здесь.

Вот как я смоделирую это. A user hasMany messages, a a message имеет createdAt. Тогда упорядочивании пользователей, последнее сообщение становится делом нескольких простых вычисляемых свойств:

App.Message = DS.Model.extend({ 
    user: DS.belongsTo('user'), 
    createdAt: DS.attr('date') 
}); 

App.User = DS.Model.extend({ 
    messages: DS.hasMany('message'), 
    name: DS.attr('string'), 
    email: DS.attr('string'), 

    messagesSorting: ['createdAt:desc'] 
    orderedMessages: Ember.computed.sort('messages', 'messagesSorting'), 
    latestMessage: Ember.computed.alias('orderedMessages.firstObject') 
}); 

Теперь в вашем контроллере/компоненте (что бы ни отображение пользователей), вы можете создать новое вычисляемое свойство для сортировки пользователей:

App.SomeController = Ember.Controller.extend({ 
    usersSorting: ['latestMessage:desc'], 
    sortedUsers: Ember.computed.sort('model', 'usersSorting') 
}); 

и использовать это свойство в своем шаблоне.


P.S. вы должны начать использовать Ember CLI, если это возможно :)

+0

Спасибо за ответ, мои знания Ember довольно ограничены, так что это была отличная помощь! Я реализую вышеупомянутое решение и вернусь с моими результатами .... что касается ember-cli, каковы преимущества его использования? Пока у меня не было большого опыта. Рекомендуется ли использовать его с Rails API? – JellyFishBoy

+0

, записывая ваш код в виде модулей, среди многих других. попробуйте: www.ember-cli.com –

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