post archives: fix N+1 problem when fetching previous version.

This commit is contained in:
evazion
2017-03-30 16:22:40 -05:00
committed by r888888888
parent 964197d403
commit 1ae5b7ba2f
3 changed files with 9 additions and 3 deletions

View File

@@ -3,7 +3,7 @@ class PostVersionsController < ApplicationController
respond_to :html, :xml, :json
def index
@post_versions = PostArchive.includes(:post, :updater).search(params[:search]).order("updated_at desc, id desc").paginate(params[:page], :limit => params[:limit], :search_count => params[:search])
@post_versions = PostArchive.includes(:updater, post: [:versions]).search(params[:search]).order("updated_at desc, id desc").paginate(params[:page], :limit => params[:limit], :search_count => params[:search])
respond_with(@post_versions) do |format|
format.xml do
render :xml => @post_versions.to_xml(:root => "post-versions")

View File

@@ -21,6 +21,6 @@ class ReportsController < ApplicationController
def upload_tags
@user = User.find(params[:user_id])
@upload_reports = Reports::UploadTags.includes(versions: [:post]).for_user(params[:user_id]).order("id desc").paginate(params[:page], :limit => params[:limit])
@upload_reports = Reports::UploadTags.includes(versions: { post: :versions }).for_user(params[:user_id]).order("id desc").paginate(params[:page], :limit => params[:limit])
end
end

View File

@@ -96,7 +96,13 @@ class PostArchive < ActiveRecord::Base
end
def previous
PostArchive.where("post_id = ? and version < ?", post_id, version).order("version desc").first
# HACK: if all the post versions for this post have already been preloaded,
# we can use that to avoid a SQL query.
if association(:post).loaded? && post.association(:versions).loaded?
post.versions.sort_by(&:version).reverse.find { |v| v.version < version }
else
PostArchive.where("post_id = ? and version < ?", post_id, version).order("version desc").first
end
end
def diff(version = nil)