load conversations and visibilities in one query with correct order

This commit is contained in:
Benjamin Neff 2015-06-04 20:28:30 +02:00 committed by Dennis Schubert
parent 735d692ac0
commit 0ffb83d351
3 changed files with 27 additions and 21 deletions

View file

@ -5,35 +5,41 @@ class ConversationsController < ApplicationController
respond_to :html, :mobile, :json, :js respond_to :html, :mobile, :json, :js
def index def index
@conversations = current_user.conversations.paginate( @visibilities = ConversationVisibility.includes(:conversation)
:page => params[:page], :per_page => 15) .order("conversations.updated_at DESC")
.where(person_id: current_user.person_id)
.paginate(page: params[:page], per_page: 15)
@visibilities = current_user.conversation_visibilities.paginate( if params[:conversation_id]
:page => params[:page], :per_page => 15) @conversation = Conversation.joins(:conversation_visibilities)
.where(conversation_visibilities: {
@conversation = Conversation.joins(:conversation_visibilities).where( person_id: current_user.person_id,
:conversation_visibilities => {:person_id => current_user.person_id, :conversation_id => params[:conversation_id]}).first conversation_id: params[:conversation_id]
}).first
@unread_counts = {}
@visibilities.each { |v| @unread_counts[v.conversation_id] = v.unread }
@first_unread_message_id = @conversation.try(:first_unread_message, current_user).try(:id)
if @conversation if @conversation
@first_unread_message_id = @conversation.first_unread_message(current_user).try(:id)
@conversation.set_read(current_user) @conversation.set_read(current_user)
end end
end
@conversations = []
@unread_counts = {}
@authors = {} @authors = {}
@conversations.each { |c| @authors[c.id] = c.last_author }
@ordered_participants = {} @ordered_participants = {}
@conversations.each { |c| @ordered_participants[c.id] = (c.messages.map{|m| m.author}.reverse + c.participants).uniq } @visibilities.each {|v|
@unread_counts[v.conversation_id] = v.unread
c = v.conversation
@conversations << c
@authors[c.id] = c.last_author
@ordered_participants[c.id] = (c.messages.map(&:author).reverse + c.participants).uniq
}
gon.contacts = contacts_data gon.contacts = contacts_data
respond_with do |format| respond_with do |format|
format.html format.html
format.json { render :json => @conversations, :status => 200 } format.json { render json: @conversations, status: 200 }
end end
end end

View file

@ -67,8 +67,8 @@ class User < ActiveRecord::Base
has_many :blocks has_many :blocks
has_many :ignored_people, :through => :blocks, :source => :person has_many :ignored_people, :through => :blocks, :source => :person
has_many :conversation_visibilities, -> { order 'updated_at DESC' }, through: :person has_many :conversation_visibilities, through: :person
has_many :conversations, -> { order 'updated_at DESC' }, through: :conversation_visibilities has_many :conversations, through: :conversation_visibilities
has_many :notifications, :foreign_key => :recipient_id has_many :notifications, :foreign_key => :recipient_id

View file

@ -21,7 +21,7 @@
- else - else
#no_conversations #no_conversations
= t('.no_messages') = t('.no_messages')
= will_paginate @conversations, :previous_label => '&laquo;', :next_label => '&raquo;', :inner_window => 1, :renderer => WillPaginate::ActionView::BootstrapLinkRenderer = will_paginate @visibilities, :previous_label => "&laquo;", :next_label => "&raquo;", :inner_window => 1, :renderer => WillPaginate::ActionView::BootstrapLinkRenderer
.span8 .span8
- if @conversation - if @conversation