1

我有一个可以has_many发送消息的对话模型。在我的查询中,我有

@active_conversations = Conversation.includes(:messages)..........

这在很大程度上解决了我的 N+1 个查询。这是我的问题:

index.html.erb

<% @active_conversations.each do |conversation| %>

<div class="<%= 'unread' if conversation.has_unread_messages?(current_user) %>">

<span><%= conversation.messages.first.body.truncate(50) %></span>

</div> 

<%end%>

对话.rb

  def has_unread_messages?(user)
    !self.messages.unread.where(:receiver_id => user.id).empty?
  end

消息.rb

  def self.unread
    where("read_at IS NULL")
  end

没有 n+1 的问题conversation.message.body

问题在于 -if conversation.has_unread_messages?(current_user)因为对于每个对话,它都在运行该查询以检查该对话中的消息是否未被阅读。

4

1 回答 1

4

由于您已:messages在查询中包含 ,因此您已加载所有消息,因此您实际上不需要另一个查询来检查它是否未读以及所有对话消息是否未读。您可以创建检查这些状态的方法:

def has_unread_messages?(user)
  unread = self.messages.collect {|m| m.read_at.nil? && m.receiver_id == user.id}
  !unread.empty?
end

您在其中的所有消息@conversation.messages都已预加载。

更新

这是更新的解决方案:

def has_unread_messages?(user) 
  messages.any? { |message| message.read_at.nil? && message.receiver_id == user.id } 
end
于 2013-08-21T17:07:28.570 回答