我有两种不同的对话,开始和加入。我想将它们一起渲染到从最上面到底部最旧的相同流中。也就是说,我希望它们混合在一起,以便最新的会话在顶部,无论它是由用户启动还是由用户加入(即由另一个用户启动)。
来自我的控制器:
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 %>
所以即使是最老的开始对话也会在最新加入的对话之上。如何渲染这两个对象以使它们混合在一起,即最新开始或加入的对话将始终位于顶部?谢谢!
答案 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
的集合,并且应该能够简单地渲染它。