2016-10-20 5 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を使用してください(私はRailsの実装に気づいていませんので、未処理のSQLクエリを実行する必要があります)。

私の意見では、データベースを修正するか、QueryMethods#left_outer_joinsを使用して結合を遅延させるか、2つの単一のクエリを使用するだけです。

関連する問題