2016-10-20 50 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來「懶」連接,或者只使用兩個單一的查詢。