У меня есть две модели:
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 записей это особая ситуация A, когда user1 отправляет сообщения только своим друзьям.
* 1 028 * б)
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, в противном случае, у меня есть то, что я хочу иметь - все три друга упорядочены по самой последней дате сообщения, которое появляется в разговоре между данным пользователем и его другом.
в)
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. Пользователь2 как партнер пользователя1 отсутствует Причина :joins => :sender
. В противном случае, если :joins => :recipient
будет отсутствовать user3 и user4. Это взломщик. Неважно, как мы присоединяемся к моделям . Как решить эту ситуацию одним запросом?