按多列分组结果

时间:2012-09-11 11:54:16

标签: ruby-on-rails ruby-on-rails-3

我正在尝试在我的Rails应用程序中实现类似facebook的消息系统。

我的消息模型如下所示:

sender_id:references
receiver_id:references
body:text
is_read:bolean

现在我需要显示当前登录用户和其他用户之间的所有消息,因此我正在使用此代码:

Message.where("sender_id = '#{current_user.id}' OR receiver_id = '#{current_user.id}'")

但是,此查询会分别威胁send条消息和received条消息。我需要通过receiver_idsender_id列以某种方式对它们进行分组,以显示用户列表,当前已登录的用户曾与之交换过消息(就像在Facebook上一样)但我是不太确定应该如何正确完成。

任何帮助将不胜感激。如果您认为应该采用不同的方式,请随时告诉我:)

1 个答案:

答案 0 :(得分:1)

好的,首先要做的事情。如果可以避免,请勿在{{1​​}}通话中直接插入(使用#{})(您几乎总是可以)。在这种特殊情况下,它可能没有造成任何巨大的伤害,但如果你习惯这样做,你最终会打开自己的SQL注入攻击。使用Rails提供的插值和清理技术之一。这是一个:

.where()

现在,就问题本身而言。假设您没有尝试对这些结果或其他任何内容进行分页,那么您无论如何都会将所有Message对象加载到内存中,因此您不会因为在Ruby而不是SQL中将它们分组而丢失任何内容:

messages = Message.where("sender_id = :user_id OR receiver_id = :user_id", :user_id => current_user.id)

基本上,这会根据发件人或收件人不是当前用户的ID对邮件进行分组。 grouped_messages = messages.group_by do |m| if m.sender_id == current_user.id m.receiver_id else m.sender_id end end 将是一个哈希,其中的键是另一个用户的id,值是Message对象的数组。