2012-08-17 2 views
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']) 
end 

내보기에, 나는 다음과 같이 표현하고있다 :

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

그래서 심지어 가장 오래된 시작된 대화가 최신 합류 대화 이상이어야합니다. 이 두 객체가 어떻게 섞여서 렌더링 되었는가? 즉, 가장 최근에 시작된 OR 조인 대화가 항상 위에 표시됩니다. 감사!

답변

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 3.x와 2.x에서 약간 다르게 보일 것이므로, Rails의 버전과 사용중인 데이터베이스에 관계가 있습니다.

어느 경우 든 @conversations이라는 하나의 콜렉션으로 끝나고 간단히 렌더링 할 수 있어야합니다.

관련 문제