如何显示多个模型的列表

时间:2019-03-22 23:06:01

标签: ruby-on-rails ruby

我正在研究Facebook之类的社交网络媒体。 用户可以创建每日帖子和事件。

在时间轴中,我想显示@post@event的组合列表。我可以在Rails上构建它吗?

下面在控制器中如何处理

@feed = Post.all + Event.all

我也应该划分每个缩略图视图。

因此,多个项目组合在一起。

2 个答案:

答案 0 :(得分:3)

将每个帖子和事件添加到内存中的数组确实很危险,请不要这样做!

我可以为您的问题想出两种解决方案。


1-最简单的

每次创建一个时,将一个具有多态关联的额外模型添加到Post或Event以及created_at中。然后,您可以在数据库级别对额外的模型进行排序和分页。这样,您就不会遇到内存问题。

您可以使用一些辅助方法来预加载该结果集的帖子和事件,以防止N + 1查询问题,因为您不能在多态关联上使用包含/引用。

优点:易于实现

缺点:添加了一个额外的模型,您需要实现信息的预加载以防止N + 1个查询,如果需要添加一些where语句,则必须复制数据或将表与其他表联接。 / p>


2-最难

对两个表都使用UNION查询,并返回必要的字段以显示它们。

union_qry = "(SELECT 'Post', id, created_at, '' as title, '' as place FROM posts) UNION (SELECT 'Event', id, created_at, title, place FROM events)"

arr = ActiveRecord::Base.connection.execute("#{search_qry} ORDER BY created_at DESC LIMIT #{per} OFFSET #{offset}") #note the per and offset if you need pagination

该查询将返回一个MySQL :: Result,您可以对其进行迭代,对于每条记录,您将拥有一个数组,如:

['Post', post_id, post_created_at, '', '']

['Event', event_id, event_created_at, event_title, event_place]

使用这些数组,您可以构建Post + Event列表,如果需要更多数据,只需将其添加到UNION语句中即可。

优点:无需多余的元素,无需重复信息,您可以在其他字段中使用where

缺点:距离ActiveRecord很远,没有很好的查询,没有很好的ActiveRecor对象


我个人更喜欢选项2,它更灵活,但是选项1更容易。

答案 1 :(得分:0)

这是您所要求的非常简单的实现:

@feed = [*Post.all, *Event.all].sort_by(&:created_at)

然后在您看来:

@feed.each do |thing|
  # thing can be a Post or an Event
end