2016-10-20 4 views
0

는 관계가 나는 사용자가 소유자 또는 수신기 또는 보낸 사람이 어디 모든 대화를하고 싶지조인으로 쿼리가 완료되지 않은 결과를 생성합니까? 여기

class Conversation < ApplicationRecord 
    belongs_to :user 
    has_many :messages 

class Message < ApplicationRecord 
    belongs_to :sender, class_name: 'User' 
    belongs_to :receiver, class_name: 'User' 
    belongs_to :conversation 

처럼 보이게하는 방법이다, 내가 그렇게

[79] pry(main)> Conversation.joins(:messages).where("messages.receiver_id = ? OR messages.sender_id = ? OR conversations.user_id = ?", 2, 2, 2).count 
    (0.5ms) SELECT COUNT(*) FROM "conversations" INNER JOIN "messages" ON "messages"."conversation_id" = "conversations"."id" WHERE (messages.receiver_id = 2 OR messages.sender_id = 2 OR conversations.user_id = 2) 
=> 0 

그러나 0처럼 그 일을하고 내가 가진, 잘못 대화로 user_id: 2

[78] pry(main)> Conversation.where(user_id: 2).count 
    (0.4ms) SELECT COUNT(*) FROM "conversations" WHERE "conversations"."user_id" = $1 [["user_id", 2]] 
=> 1 

어떤 질문이 내 질문에 잘못 되었나요?

답변

0

QueryMethods#joins 테이블의 LEFT INNER JOIN을 수행 (읽기 : "번역 됨")합니다.

쿼리의 대화와 메시지는 "messages"."conversation_id" = "conversations"."id"을 통해 연결해야합니다. 너의 것은 연결되지 않은 것 같다.

이제 질문은 결과로받을 것으로 예상되는 것입니다. 내부적으로 연결되었는지 여부에 관계없이 사용자와 관련된 모든 것을 원한다면 CROSS JOIN을 사용하십시오. (레일스 구현을 인식하지 못했습니다. 원시 SQL 쿼리를 실행해야 할 수도 있습니다.)

데이터베이스를 수정하거나 QueryMethods#left_outer_joins을 사용하여 "lazy"조인하거나 두 개의 단일 쿼리 만 사용하십시오.

관련 문제