2012-09-12 2 views
0

저는 Gmail에서 대화를 쿼리하는 방법에 대해 생각 해왔습니다. 다른 기술을 사용하고 있다는 것을 알고 있지만 최선을 다해 모방하고 싶습니다.레일 3은 관계에서 특정 행에만 합류합니다.

현재 대화 목록을 가져 와서 각 대화마다 메시지를 가져와야합니다. 일반 가입을 사용할 수 있습니다.

Conversation.joins(:messages).first 

하지만 모든 메시지가 하나씩 들어갑니다. 마지막 메시지 만 필요합니다. 이 쿼리를 어떻게 구성합니까? 내가 대화 내용을 수행 할 때 더 나은 가입하는 것입니다 :

Conversation.joins(:messages).all # but only join last message for each conversation 

는 또한, 내가 특정 사용자 ID와 마지막 메시지를 가입 조건을 사용할 수

?

message.user_id = 1 
Conversation.joins(:messages).all # only last message where user_id = 1 

쿼리를 시연 할 때 도움이된다면 squeel을 사용하고 있습니다.

대화를 가져 오는 가장 최적의 방법과 각 대화의 마지막 메시지는 무엇입니까?

답변

2

이것은 일반적으로 having 절을 사용하여 수행됩니다. 당신이 뭔가를 할 수있는, Squeel에서 (주, 검증되지 않은) :

user.conversations.includes{messages}.group{id}.having{messages.id == max(messages.id)} 

그런 다음 모든 행 있지만 각에서 최대 메시지 ID로 하나를 걸러하는 데 사용하여 대화 ID에 그룹화됩니다 그룹.

참고 : "having"은 많은 경우에 특히 바람직하지 않습니다. 검색어에 대한 설명을 확인하여 자신이 지나치게 고통스럽지 않도록해야합니다. 그렇다면 대화의 마지막 메시지를 가리키는 대화에 캐시 열을 추가 한 다음 해당 열과의 연결을 설정하기 만하면됩니다.

+0

고마워요! 그것은 크게 도움이 될 것입니다! –

관련 문제