2013-11-08 2 views
7

Есть три модели в проектерельсов запрос соединения, заказ, группы по вопросу

  • разговора
  • conversation_message
  • сообщения

Conversation.rb

class Conversation < ActiveRecord::Base 
    #subject 
    has_many :conversation_messages, :dependent => :destroy 
    has_many :messages, :through => :conversation_messages, :dependent => :destroy, :order => "created_at DESC" 
end 

ConversationMessage.rb

class ConversationMessage < ActiveRecord::Base 
    #conversation_id, message_id 
    belongs_to :conversation 
    belongs_to :message, :dependent => :destroy 
end 

Message.rb

#sender_id, receiver_id, message 

has_one :conversation_message, :dependent => :destroy 
has_one :real_conversation, :through => :conversation_message, :source => "conversation" 

Так что я хочу, чтобы получить current_user «ы все разговоры и хотят, чтобы показать их в порядке последнего сообщения, принятого или отправленного. Также хотите показать одиночный разговор для всех своих сообщений, и разговор должен быть заказан сообщениями, включенными в него. Использование рельсов 3.0

Я попробовал следующий запрос, но дает мне ошибку ниже запроса

@user_conversations = Conversation 
.joins(:messages) 
.where(["messages.receiver_id = ? or messages.sender_id = ?", current_user.id, current_user.id ]) 
.group("conversations.id").order("messages.created_at DESC") 

ошибка

PG::GroupingError: ERROR: column "messages.created_at" must appear in the GROUP BY clause or be used in an aggregate function 

ответ

16

Вам необходимо включить messages.created_at в group пункте:

@user_conversations = Conversation 
.joins(:messages) 
.where(["messages.receiver_id = ? or messages.sender_id = ?", current_user.id, current_user.id ]) 
.group("conversations.id, messages.created_at") 
.order("messages.created_at DESC") 

См .: column "users.id" must appear in the GROUP BY clause or be used in an aggregate function

+0

Я хочу показать отдельный разговор для всех связанных с ним сообщений, а список разговоров должен быть упорядочен сообщениями в разговоре. – chaitanya

6

Вы можете не показывать несколько разговоров с помощью

.order("max(messages.created_at) DESC")

и удаление messages.created_at из group секции.

@user_conversations = Conversation 
.joins(:messages) 
.where(["messages.receiver_id = ? or messages.sender_id = ?", current_user.id, current_user.id ]) 
.group("conversations.id") 
.order("max(messages.created_at) DESC") 

Это дает вам «уникальные разговоры, упорядоченные по последним комментариям».

Это не просто заказав по messages.created_at, но с изменением max и min и DESC и ASC будет делать работу, которую вы хотите, я думаю.

+0

Вау, большое вам спасибо за это. Включение 'max()' является разницей между этой рабочей и нерабочей - и это ломало мой мозг в течение нескольких дней. – jeffdill2

Смежные вопросы