使用join查询会产生未完成的结果吗?

时间:2016-10-20 06:35:43

标签: ruby-on-rails ruby

以下是关系的样子

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

我的查询有什么问题吗?

1 个答案:

答案 0 :(得分:0)

QueryMethods#joins执行(读取:“翻译为”)一个LEFT INNER JOIN个表格。

查询中的对话和消息应通过"messages"."conversation_id" = "conversations"."id"自行关联。你的似乎没有联系。

现在问题是你期望得到什么结果。如果你想要与用户相关的所有内容,无论它是否在内部链接,请使用CROSS JOIN(我不知道Rails实现,你可能需要为此执行原始SQL查询。)

在我看来,您要么修复数据库,要么使用QueryMethods#left_outer_joins来“懒惰”加入,或者只使用两个单一查询。