以下是关系的样子
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 :(得分:0)
QueryMethods#joins
执行(读取:“翻译为”)一个LEFT INNER JOIN
个表格。
查询中的对话和消息应通过"messages"."conversation_id" = "conversations"."id"
自行关联。你的似乎没有联系。
现在问题是你期望得到什么结果。如果你想要与用户相关的所有内容,无论它是否在内部链接,请使用CROSS JOIN
(我不知道Rails实现,你可能需要为此执行原始SQL查询。)
在我看来,您要么修复数据库,要么使用QueryMethods#left_outer_joins
来“懒惰”加入,或者只使用两个单一查询。