1

Я пытаюсь реализовать приложение для сообщений без ActionCable. Когда я просматриваю все сообщения, я хочу показать только последнее сообщение от этого пользователя: вместо того, чтобы показывать все сообщения, от пользователя я показываю только последнее. Я не знаю, как это достичь. Я думал, что смогу установить key на user_id вместо id.Показать последнего ребенка в ответной итерации

_messagesRender: function(){ 
    var messages = this.props.message.map(function(m, i){ 
    return(
     <li key={m.user_id}>{m.body}</li> 
    ) 
    }); 
    return(
    <div>{messages.length === 0 ? "No messages" : messages}</div> 
) 
}, 

Этот компонент находится на индексной странице, и я пытаюсь создать приложение, подобное сообщению. Любые указатели с реактивом? Рельсы 5 используются в качестве задней части.

Warning: flattenChildren(...): Encountered two children with the same key, .$2 . Child keys must be unique; when two children share a key, only the first child will be used.

Назад конец:

@messages = Message.where(to: current_user.id) 

модель Сообщение: :id, :to, :user_id, :body

user_id, кто посылает/создал сообщение.

+0

@potashin К сожалению. Сообщение обновлено. – Sylar

+0

Какие RDBMS вы используете, кстати? (MySQL, Postgres и т. Д.) – potashin

+0

Im using PostgreSQL – Sylar

ответ

2

Вы можете попробовать следующее:

Message.where(to: current_user.id) 
     .order(:created_at) 
     .group_by(&:user_id) 
     .map{|_, x| x.last} 

Это должно дать последнее сообщение (по created_at) от каждого user_id.

Пока вы используете Postgresql, вы можете попробовать distinct on подход:

Message.where(to: current_user.id) 
     .order(user_id: :asc, created_at: :desc) 
     .select('distinct on (user_id) *') 
+0

Отлично! Поскольку пользователь user_id является пользователем, который создает сообщение, я мог бы безопасно заменить ': from' на': user_id'? – Sylar

+1

@Sylar: Да, вы можете – potashin

+1

Очень ценится. Спасибо. – Sylar

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