【问题标题】:Display Last Child in React Iteration在 React 迭代中显示最后一个孩子
【发布时间】:2016-06-16 14:33:09
【问题描述】:

我正在尝试实现一个消息应用程序,目前没有 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>
  )
},

这个组件在索引页面上,我正在尝试创建一个类似消息的应用程序。任何关于 React 的指针? Rails 5 用作后端。

警告:flattenChildren(...):遇到两个孩子使用相同的密钥,.$2。子键必须是唯一的;当两个孩子共享一个密钥时,只会使用第一个孩子。

后端:

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

消息模型::id, :to, :user_id, :body

user_id 是发送/创建消息的人。

【问题讨论】:

  • @potashin 对不起。帖子已更新。
  • 顺便说一句,您使用的是什么 RDBMS?(MySQL、Postgres 等)
  • 我正在使用 PostgreSQL

标签: sql ruby-on-rails postgresql activerecord ruby-on-rails-5


【解决方案1】:

您可以尝试以下方法:

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

这应该给出来自每个user_id 的最后一条消息(created_at)。

只要你用的是Postgresql,可以试试distinct on的方法:

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

【讨论】:

  • 太棒了!由于user_id 是创建消息的用户,我可以安全地将:from 替换为:user_id?
  • @Sylar:是的,你可以
  • 非常感谢。谢谢。
  • @Sylar:我无法测试第二种方法,因为我的机器上没有安装 Posgres)
  • 第一个效果很好。我稍后会测试第二个,然后告诉你。
猜你喜欢
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 2013-03-12
  • 2012-02-09
  • 2013-06-06
相关资源
最近更新 更多