我正在研究Facebook之类的社交网络媒体。 用户可以创建每日帖子和事件。
在时间轴中,我想显示@post
和@event
的组合列表。我可以在Rails上构建它吗?
下面在控制器中如何处理
@feed = Post.all + Event.all
我也应该划分每个缩略图视图。
因此,多个项目组合在一起。
答案 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