2016-10-16 54 views
0

我有2個表:Rails的ActiveRecord的查找表屬性的給定值條件2個表

  1. 包含會話列表關聯到每個(「recipient_id」它們的ID(和兩個用戶ID的會話表和'sender_id')
  2. 包含與現有對話之一相關消息的消息表每個消息實例都包含布爾屬性'read'(默認爲false),用於顯示對話中是否有未讀消息。

所以對話has_many:消息和消息belongs_to:對話

我的目標是檢查current_user是否有任何未讀消息(在他的任何現有會話中)顯示一般警報。 到目前爲止,我已經設法爲每個對話顯示一個警報,但我正在努力尋找一種有效的方式來實現一個通用的。

我最初的做法是:

  1. 在每個當前用戶的對話找到的最後一條消息。
  2. 評估當前用戶是否發送了最後一封郵件中的每一封郵件,以及是否讀取== false。
  3. 如果上一條消息中的任何一條符合這些條件,則返回true。

這翻譯成以下代碼:

@conversations = current_user.conversations 
    @unread = [] 
    if @conversations.exists? 

     @conversations.each do |conversation| 
     if conversation.messages.exists? 
      if conversation.messages.last.user_id != current_user.id && conversation.messages.last.read == false 
      @unread << true 
      end 
     end 
     end 
    end 

    @unread.include?(true) 
end 

我很新的編碼,但它似乎在所有CURRENT_USERS對話具有循環並創建一個陣列,以檢查是否有任何「一個非常低效的方法真正的「價值。

我會循環瀏覽郵件本身,但實例只有發件人的user_id,所以如果我沒有將它與Conversation模型關聯起來,就無法知道郵件是否發送給他。

你能幫助一個有效的方法來實現這一點,更適當的活動記錄查詢或更好的方法。順便說一下,不知道如果事情,但我在我的開發環境中使用PostgreSQL。

感謝

回答

0

您可以像得到conversation IDS爲current_user

conv_ids = current_user.conversations.pluck(:id) 

的做一個查詢得到的消息計數滿足您的要求的標準,如:

unread_count = Message.where(convsersation_id: conv_ids, read: false).where.not(user_id: current_user.id).count 

如果unread_count > 0那麼你可以顯示警報

我假設一旦讀取所有消息都會獲得read :true值,因此即使其他任何其他消息(對話中的最後一條消息)具有read :false,此查詢也將返回true。

PS:我還沒有測試過查詢,所以檢查它並做必要的調整。如果我在這裏丟失了任何東西,請在評論中提問。

+0

非常感謝Sajan。這說得通。讓我試試看,一有消息就儘快回覆你。 – Andrew

相關問題