0

開始済みと参加済みの 2 種類の会話があります。私はそれらを同じストリームで、上から下へ、最も古いものへと一緒にレンダリングしたいと考えています。つまり、ユーザーが開始したか、ユーザーが参加した (つまり、別のユーザーが開始した) かに関係なく、最新の会話が一番上になるようにそれらを混在させたいと考えています。

私のコントローラーから:

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 %>

そのため、開始された最も古い会話であっても、参加した最新の会話の上に表示されます。これら 2 つのオブジェクトが混在するようにレンダリングするにはどうすればよいですか。つまり、最新の開始または結合された会話が常に一番上になりますか? ありがとう!

4

1 に答える 1

0

実際にはいくつかの方法がありますが、必要なのは、1 つのコレクションで両方の種類の会話を行うことです。

これで、両方の既存のコレクションを取り、それらをまとめて (配列結合演算子 '|' を使用して)、並べ替えることができます。

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

ただし、この種のフィルタリングとソートはデータベースの本来の目的であるため、関連するすべての会話を 1 つのクエリで収集した方がよいと思います。そのクエリが何であるかを説明したいと思いますが、モデル/テーブルが何であるか、それらがどのように関連付けられているか、ユーザーが会話に参加または開始したことが何を意味するか、およびRails 3.x と 2.x では見た目がかなり異なるため、Rails のバージョンと使用しているデータベースが重要です。

いずれの場合も、最終的に という 1 つのコレクションが作成され@conversations、それを簡単にレンダリングできるはずです。

于 2012-08-17T14:25:09.077 に答える