【发布时间】:2023-03-21 01:10:02
【问题描述】:
我有两个模型:
class User
end
class Message
belongs_to :sender, :class_name=> 'User'
belongs_to :recipient, :class_name=> 'User'
end
我想获取给定用户的所有好友,这些好友按给定用户和他的好友之间的对话中出现的消息的最近日期排序,并且如果可能在同一个查询中,获取他们对话中的消息数。
现在,我陷入了困境:
Messages.all(:joins => :sender,
:conditions => ['sender_id = ? OR recipient_id = ?', some_user.id, some_user.id],
:select => 'users.*, sender_id, recipient_id, MAX(messages.created_at) as last_created, COUNT(messages.id) as messages_count',
:group => 'messages.sender_id, messages.recipient_id',
:order => 'last_created DESC'
该查询产生以下输出:
一)
users.* | sender_id | recipient_id | MAX(last_created) | messages_count
user1 | 1 | 2 | bla | bla
user1 | 1 | 3 | bla | bla
user1 | 1 | 4 | bla | bla
因为messages.sender_id = user.id 加入的模型我只获取了 user1 记录,但我需要 user2、user3 和 user4 em> 记录那个特殊情况 A 当 user1 只向他的好友发送消息时。
b)
users.* | sender_id | recipient_id | MAX(last_created) | messages_count
user2 | 2 | 1 | bla | bla
user3 | 3 | 1 | bla | bla
user4 | 4 | 1 | bla | bla
在情况 B 中,否则,我有我想要的 - 所有三个好友都按消息的最近日期排序,出现在给定用户和他的好友之间的对话中。
c)
users.* | sender_id | recipient_id | MAX(last_created) | messages_count
user1 | 1 | 2 | bla | bla
user3 | 3 | 1 | bla | bla
user4 | 4 | 1 | bla | bla
情况 C. 作为 user1 的好友的 user2 缺少原因 :joins => :sender。否则,如果:joins => :recipient 将缺少 user3 和 user4。那是饼干。 无论我们如何加入模型。如何在一个查询中解决这种情况?
【问题讨论】:
-
只有一件事:它是
:class_name。
标签: sql ruby-on-rails activerecord