我正在尝试在我的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_id
和sender_id
列以某种方式对它们进行分组,以显示用户列表,当前已登录的用户曾与之交换过消息(就像在Facebook上一样)但我是不太确定应该如何正确完成。
任何帮助将不胜感激。如果您认为应该采用不同的方式,请随时告诉我:)
答案 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对象的数组。