在同一个流中渲染最新的两个部分

时间:2012-08-17 13:50:32

标签: ruby-on-rails rendering

我有两种不同的对话,开始和加入。我想将它们一起渲染到从最上面到底部最旧的相同流中。也就是说,我希望它们混合在一起,以便最新的会话在顶部,无论它是由用户启动还是由用户加入(即由另一个用户启动)。

来自我的控制器:

def conversations
  @user = current_user
  @joined_conversations = @user.received_meeting_requests.paginate(page: params[:page], :conditions => ['state = ?', 'replied'])
    @started_conversations = @user.sent_meeting_requests.paginate(page: params[:page], :conditions => ['state = ?', 'replied'])
end

在我看来,我这样呈现:

<ol class="meetings">
  <%= render @started_conversations %>
  <%= render @joined_conversations %>
</ol>
  <%= will_paginate @started_conversations %>
  <%= will_paginate @joined_conversations %>
<% end %>

所以即使是最老的开始对话也会在最新加入的对话之上。如何渲染这两个对象以使它们混合在一起,即最新开始或加入的对话将始终位于顶部?谢谢!

1 个答案:

答案 0 :(得分:0)

嗯,有几种方法可以实现它,但你需要的是在一个集合中进行两种对话。

现在,你可以只取你现有的集合,把它们放在一起(使用数组联合运算符'|'),然后求它们:

def conversations
  @user = current_user
  @joined_conversations = @user.received_meeting_requests.paginate(page: params[:page], :conditions => ['state = ?', 'replied'])
  @started_conversations = @user.sent_meeting_requests.paginate(page: params[:page], :conditions => ['state = ?', 'replied'])
  @conversations = (@joined_conversations | @started_conversations).sort_by{|c| c.created_at}
end

但是,由于这种过滤和排序是数据库的真正用途,我认为您最好收集一个查询中相关的所有会话。我想告诉你这个查询是什么,但是如果不知道你的模型/表格是什么,它们是如何关联的,对于用户加入或开始对话意味着什么,以及对于重要的是什么版本的Rails和你正在使用的数据库,因为它在Rails 3.x vs 2.x中看起来会有点不同。

在任何一种情况下,您最终都会得到一个名为@conversations的集合,并且应该能够简单地渲染它。