ruby-on-rails - 有条件地将日期分隔符插入聊天消息数组

标签 ruby-on-rails ruby

我正在开发类似于 Slack 的聊天功能,消息按日期分组。我正在使用 groupdate gem 将所有消息放在一个散列中,然后在浏览器中将它们打印出来,其中消息按发送日期分组:

@messages = @chatroom.messages.group_by_day { |message| message.created_at }

- @messages.each do |day, messages|
  %li.date_divider
  = "#{day.strftime("%B %d")}"
    %ul
      - messages.each do |message|
        %li= message.content

为了提高性能,一次加载值(value)数月的消息是很疯狂的,我正在考虑如何通过对消息进行分页和使用某种无限自动滚动来解决这个问题。我可以使用 @pagy, @messages = pagy(@chatroom.messages) 使它正常工作,但是当我使用 group_by_day 并以哈希。我很好奇是否有人可以就如何解决这个问题发表一些意见,我仍然可以通过按日期对消息进行分组来从用户体验中获益,而且还可以从上述案例中的性能中获益。

除了使用 group_by_day 之外,一个建议是对按日期排序的消息数组进行分页,并有条件地在循环中添加额外的日期显示,以便在下一个项目有新日期时显示上一个,但我不确定如何立即执行此操作。

最佳答案

当您这样做时,您离实际工作版本不远了:

# controller
@pagy, @messages = pagy(@chatroom.messages)

消息存储在@messages中。当您调用 @chatroom.messages.group_by_day 时,您将对属于聊天室的所有消息调用 group_by_day。而是使用 @messages.group_by_day 保存由 pagy 返回的消息。

-# view
- @messages = @messages.group_by_day { |message| message.created_at }

- @messages.each do |day, messages|
  -# ...

对于那里的无限滚动,您可能需要使用一个库。基本思想是当用户滚动到页面顶部或底部附近时从服务器获取消息。然后,您可以使用 JavaScript 将它们插入 HTML 中的正确位置。

请注意,您不必做其中之一。您可以无限滚动按日期对消息进行分组。尽管实现起来可能有些困难。

我在这个答案中省略了细节,因为这值得单独提问。请注意,您不应立即创建新问题。首先有一个look around the internet对于不同的库或方法来创建自己的库或方法,请尝试解决一些问题。然后,如果您遇到困难或有特定问题,您应该创建一个新问题。

关于ruby-on-rails - 有条件地将日期分隔符插入聊天消息数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61515354/

相关文章:

javascript - 一些代码让我在这个 gem 中感到困惑 ----backbone-bootstrap-rails

Ruby 覆盖类方法

ruby - 为什么 STDOUT 在 Ruby 中只显示一次返回的消息?

ruby-on-rails - Assets 在隔离的引擎端点中不起作用

ruby-on-rails - Rails 中同一路由的 POST 和 GET 请求的不同 Controller 操作

ruby-on-rails - 设计编辑注册无法正常工作

ruby-on-rails - 如何正确链接到静态页面?

php - 使用 Assetic PHP 安装 RVM 后 Sass 损坏

ruby - 使用 'redis-sentinel' 配置 'sidekiq' gem

ruby-on-rails - Rails action Mailer raise_delivery_errors,它是如何工作的?如何检测反弹?