2016-10-16 2 views
0

에서 테이블 속성의 값이 주어진 조건을 찾을 수 :레일 액티브 내가 2 개 테이블이이 개 테이블

  1. 각 ('recipient_id'에 관련된 자신의 ID를 (두 개의 사용자 ID가 대화 목록을 포함하는 대화 테이블 및 'sender_id')
  2. 기존 대화 중 하나와 관련된 메시지가 포함 된 메시지 테이블 모든 Message 인스턴스에는 대화에 읽지 않은 메시지가 있는지 표시하기위한 부울 속성 '읽기'(기본값은 false)가 포함됩니다. .

대화 has_many : 메시지와 메시지 belongs_to : conversation

내 목표는 current_user에 (기존 대화 중) 읽지 않은 메시지가 있으면 일반 경고를 표시하는지 확인하는 것입니다. 지금까지 각 대화마다 경고를 표시했지만 일반적인 방법을 구현하는 효율적인 방법을 찾기 위해 애 쓰고 있습니다.

  1. 는 현재 사용자의 대화의 각각의 마지막 메시지 찾기 :

    내 원래의 접근 방식에 있었다.

  2. 현재 사용자가 마지막 메시지를 각각 보내고 read == false 인 경우 평가하십시오.
  3. 마지막 메시지 중 하나라도 이러한 조건을 충족하면 true를 반환합니다.

이 다음 코드로 번역 :

@conversations = current_user.conversations 
    @unread = [] 
    if @conversations.exists? 

     @conversations.each do |conversation| 
     if conversation.messages.exists? 
      if conversation.messages.last.user_id != current_user.id && conversation.messages.last.read == false 
      @unread << true 
      end 
     end 
     end 
    end 

    @unread.include?(true) 
end 

나는 아주 새로운 코딩 해요하지만 모든 CURRENT_USERS 대화를 통해 루프를 갖는 '어떤이 있는지 확인하기 위해 배열을 만드는 매우 비효율적 인 방법을 보인다 true '값을가집니다.

메시지 자체를 반복하지만 인스턴스에는 보낸 사람의 user_id 만 있으므로 대화 모델과 연결하지 않으면 메시지가 그에게 전송되었는지 여부를 알 수 없습니다.

더 적절한 액티브 레코드 쿼리 또는 더 나은 접근 방법으로이를 달성하는 효율적인 방법을 도울 수 있습니까?

그건 그렇고 확실하지는 않지만 내 dev 환경에서 postgresql을 사용하고 있습니다.

감사

답변

0

당신은 같은 의해 current_user에 대한 conversation ID를 얻을 수 있습니다 :

unread_count = Message.where(convsersation_id: conv_ids, read: false).where.not(user_id: current_user.id).count 

:

conv_ids = current_user.conversations.pluck(:id) 

다음은 메시지처럼 필요한 기준을 충족 계산 얻기 위해 쿼리를 수행 unread_count > 0이면 경고를 표시 할 수 있습니다.

회신 메시지의 마지막 메시지가 read :false 인 다른 메시지가 있어도 모든 메시지가 한번 읽으면 read :true 값을 가져 오는 것으로 가정하고 있습니다.

추신 : 나는 쿼리를 테스트하지 않았으므로이를 확인하고 필요한 경우 조정을하십시오. 여기에 내용이 누락 된 경우 댓글로 질문하십시오.

+0

감사합니다. 사쟌. 말된다. 내가 뉴스를 얻 자마자 그것에 대해 생각해보고 그것에 대해 생각하게하고 다시 돌아가겠습니다. – Andrew