我想要每个用户发送的最新消息。这是样本数据
表:对话
sender receiver message date ============================================================ 1 2 "hi" "2013-03-04 09:55:01.122074" 2 1 "hello" "2013-03-04 09:55:32.903975" 1 2 "have you done with the taks?" "2013-03-04 09:57:46.383007" 2 1 "almost..." "2013-03-04 09:58:55.783219" 2 1 "should be able to finish 2day" "2013-03-04 09:59:28.950705" 2 3 "shall we start?" "2013-03-04 10:01:16.842725" 3 2 "give me a minute" "2013-03-04 10:01:41.994589" 3 2 "let us start" "2013-03-04 10:02:14.04551"
对于ID为2的用户,我应该能够获得以下两条记录
1 2 "have you done with the taks?" "2013-03-04 09:57:46.383007" 3 2 "let us start" "2013-03-04 10:02:14.04551"
这是我的解决方案
型号:用户
class User < ActiveRecord::Base has_many :chats_received, class_name: 'Conversation', foreign_key: 'receiver_id',order: "created_at DESC" end
型号:对话
class Conversation < ActiveRecord::Base attr_accessible :message, :read belongs_to :sender, class_name: 'User' belongs_to :receiver, class_name: 'User' def most_recent_chat_received_from_connected_users connected_users_chats = . . . # Get all conversations which are sent to current user. e.g., user with id 2 chats_grouped_by_senders = connected_users_chats.group_by { |conversation| conversation.sender_id } chats_grouped_by_senders.inject([]){|memo , (sender_id, conversations)| memo << conversations.first; memo} end end
获取已连接用户的最新消息:
user = User.find 2 user.most_recent_chat_received_from_connected_users
尽管此解决方案有效,但它为两个用户之间的每次转换选择并创建模型。我也觉得这不是获取所需行的方法。
我一直在使用postgresql。当我尝试在该模式下使用组方法时,出现以下错误。
ActiveRecord::StatementInvalid: PG::Error: ERROR: column "conversations.id" must appear in the GROUP BY clause or be used in an aggregate function
有没有更好的方法来获得相同的结果?
我不确定如何在没有错误的实例上调用most_recent_chat_received_from_connected_users,这是您Conversation类的实例方法User,但是我会在会话模型中添加自定义查找器:
most_recent_chat_received_from_connected_users
Conversation
User
class Conversation < ActiveRecord::Base # ... def self.most_recent_for(user_id) select('DISTINCT ON (sender_id) *').where(reciever_id: user_id).order("sender_id, created_at DESC") end # For MySQL you could have used: # # def self.most_recent_for(user_id) # where(reciever_id: user_id).group("sender_id").order("created_at DESC") # end # ... end
现在,您可以使用以下命令在控制器中进行所需的对话:
@conversations = Conversation.most_recent_for(current_user.id)