ruby-on-rails
  • ruby-on-rails-3
  • 2012-09-11 73 views 0 likes 
    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上一样),但我不太确定它应该如何正确完成。

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

    回答

    1

    好的,第一件事就是第一件事。如果你可以避免它(绝对可以),不要直接插入(使用#{})在.where()调用中。在这种特殊情况下,它可能没有造成任何巨大的伤害,但是如果你养成这样做的习惯,你最终会打开自己的SQL注入攻击。使用Rails提供的插值和消毒技术之一。这里有一个:

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

    现在,对于问题本身。假设你没有试图对这些结果或者这些结果进行分页,那么你将会把所有的Message对象加载到内存中,所以你不会在Ruby中将它们分组而丢失任何东西:

    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将是一个哈希,其中的键是其他用户的ID,值是消息对象的数组。

    相关问题