クエリ・パフォーマンスの改善(#258) (#259)

#258

#258

#258

Co-authored-by: miteruzo <miteruzo@naver.com>
Reviewed-on: #259
This commit was merged in pull request #259.
This commit is contained in:
2026-02-11 13:26:10 +09:00
parent 9b7fc9059d
commit 1a776e348a
6 changed files with 64 additions and 36 deletions
+25 -18
View File
@@ -17,16 +17,17 @@ class PostsController < ApplicationController
'posts.created_at)'
q =
filtered_posts
.preload(tags: :tag_name)
.preload(tags: { tag_name: :wiki_page })
.with_attached_thumbnail
.select("posts.*, #{ sort_sql } AS sort_ts")
.order(Arel.sql("#{ sort_sql } DESC"))
posts = (
posts =
if cursor
q.where("#{ sort_sql } < ?", Time.iso8601(cursor)).limit(limit + 1)
else
q.limit(limit).offset(offset)
end).to_a
end
.to_a
next_cursor = nil
if cursor && posts.length > limit
@@ -52,7 +53,9 @@ class PostsController < ApplicationController
end
def random
post = filtered_posts.preload(tags: :tag_name).order('RAND()').first
post = filtered_posts.preload(tags: { tag_name: :wiki_page })
.order('RAND()')
.first
return head :not_found unless post
viewed = current_user&.viewed?(post) || false
@@ -64,7 +67,7 @@ class PostsController < ApplicationController
end
def show
post = Post.includes(tags: :tag_name).find(params[:id])
post = Post.includes(tags: { tag_name: :wiki_page }).find(params[:id])
return head :not_found unless post
viewed = current_user&.viewed?(post) || false
@@ -151,7 +154,7 @@ class PostsController < ApplicationController
end
def changes
id = params[:id]
id = params[:id].presence
page = (params[:page].presence || 1).to_i
limit = (params[:limit].presence || 20).to_i
@@ -162,30 +165,34 @@ class PostsController < ApplicationController
pts = PostTag.with_discarded
pts = pts.where(post_id: id) if id.present?
pts = pts.includes(:post, { tag: :tag_name }, :created_user, :deleted_user)
pts = pts.includes(:post, :created_user, :deleted_user,
tag: { tag_name: :wiki_page })
events = []
pts.each do |pt|
tag = pt.tag.as_json(only: [:id, :category], methods: [:name, :has_wiki])
post = pt.post
events << Event.new(
post: pt.post,
tag: pt.tag.as_json(only: [:id, :category], methods: [:name, :has_wiki]),
user: pt.created_user && { id: pt.created_user.id, name: pt.created_user.name },
change_type: 'add',
timestamp: pt.created_at)
post:,
tag:,
user: pt.created_user && { id: pt.created_user.id, name: pt.created_user.name },
change_type: 'add',
timestamp: pt.created_at)
if pt.discarded_at
events << Event.new(
post: pt.post,
tag: pt.tag.as_json(only: [:id, :category], methods: [:name, :has_wiki]),
user: pt.deleted_user && { id: pt.deleted_user.id, name: pt.deleted_user.name },
change_type: 'remove',
timestamp: pt.discarded_at)
post:,
tag:,
user: pt.deleted_user && { id: pt.deleted_user.id, name: pt.deleted_user.name },
change_type: 'remove',
timestamp: pt.discarded_at)
end
end
events.sort_by!(&:timestamp)
events.reverse!
render json: { changes: events.slice(offset, limit).as_json, count: events.size }
render json: { changes: (events.slice(offset, limit) || []).as_json, count: events.size }
end
private