在轨道中呈现异构对象的集合



假设我的应用有 3 种主要类型的对象,用户可以与之交互:图片、视频和"推文"。我将任何一种对象类型甚至所有三种对象类型的集合呈现为单独的列表都没有问题:

<% @pictures.each do |picture| %>
  <%= picture.name %>
  <%= img_tag(picture.url) %>
<% end %>
<% @tweets.each do |tweet| %>
  <%= tweet.message %>
<% end %>
<% @videos.each do |video| %>
  <%= video.title %>
  <%= video.thumbnail %>
<% end %>

我想做的是渲染一个"提要",它由所有三种不同的对象类型组成,按时间顺序混合在一起。

可能的解决方案:

我已经看到了解决方案,例如创建一个名为"activity_feed"的全新数据库表,该表与所有其他模型具有多态关联,并为添加到数据库的每个对象记录一个条目。对于我想要完成的事情来说,这似乎效率低下且矫枉过正。还有"public_activity"宝石,它做同样的事情。

我一直在弄乱单独查询每个集合,然后组合集合并在 ruby 中进行排序,但在对活动记录对象进行排序时遇到问题。

@feed_items = @pictures + @videos + @tweets

理想情况下,出于性能原因,我希望能够从数据库层查询和排序所有这些内容。(我正在使用Postgres!

我是一般的轨道和编码新手。任何帮助将不胜感激!

您希望创建一个activity_feed模型,然后将项添加到活动源模型,然后查询和显示活动源模型,而不是查询多个模型。然后,您可以根据需要对此进行排序。

def create
   if @comment.save
     ActivityFeed.create(...)
   end
end

然后,当您要显示提要时,只需显示它。

https://robots.thoughtbot.com/using-polymorphism-to-make-a-better-activity-feed-in-rails

如果您不想从头开始制作,有一些活动源 Gem 可以帮助解决这个问题。

https://github.com/pokonski/public_activity

https://github.com/GetStream/stream-rails

最新更新