ruby-on-rails
  • ruby-on-rails-3
  • 2012-09-11 104 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,值是消息對象的數組。

    相關問題