2016-06-16 18 views
1

私は今のところActionCableなしでメッセージアプリケーションを実装しようとしています。すべてのメッセージをマップすると、そのユーザーからの最後のメッセージのみを表示します。ユーザーからすべてのメッセージを表示するのではなく、最後のメッセージのみを表示します。私はそれを達成する方法を知らない。私はidの代わりにkeyuser_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> 
) 
}, 

このコンポーネントはインデックスページにあり、メッセージのようなアプリを作成しようとしています。 Reactのポインタ? Rails 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

限り、あなたは、PostgreSQLを使用しているとして、あなたはdistinct onアプローチを試すことができます。投稿が更新されます。 – Sylar

+0

どのようなRDBMSを使用していますか(MySQL、Postgresなど) – potashin

+0

PostgreSQLを使用しています – Sylar

答えて

2

あなたは次のことを試すことができます。

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

これは、各user_idから(created_atで)最後のメッセージを与える必要があります。申し訳ありません@potashin

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