0

我正在尝试在我的 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 上一样),但我不太确定应该如何正确完成。

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

4

1 回答 1

1

好的,第一件事。如果可以避免(几乎总是可以) ,切勿#{}在调用中直接插入(使用)。.where()在这种特殊情况下,它可能不会造成任何巨大的伤害,但如果你养成这样做的习惯,你最终会让自己面临 SQL 注入攻击。使用 Rails 提供的一种插值和清理技术。这是一个:

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

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

 grouped_messages = messages.group_by do |m|
    if m.sender_id == current_user.id
      m.receiver_id
    else
      m.sender_id
    end
 end

本质上,这会根据不是当前用户的发送者或接收者的 id 对消息进行分组。grouped_messages将是一个 Hash,其键是其他用户的 id,值是 Message 对象的数组。

于 2012-09-11T13:47:38.620 回答