From da45bc95ebadd853a1fc3129845636e8cb5d8eaf Mon Sep 17 00:00:00 2001 From: miteruzo Date: Tue, 3 Mar 2026 00:35:31 +0900 Subject: [PATCH] #206 --- backend/app/controllers/posts_controller.rb | 28 ++++++++++++++++----- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/backend/app/controllers/posts_controller.rb b/backend/app/controllers/posts_controller.rb index c89931f..b7659a5 100644 --- a/backend/app/controllers/posts_controller.rb +++ b/backend/app/controllers/posts_controller.rb @@ -30,8 +30,20 @@ class PostsController < ApplicationController offset = (page - 1) * limit + pt_max_sql = + PostTag + .select('post_id, MAX(updated_at) AS max_updated_at') + .group('post_id') + .to_sql + + updated_at_all_sql = + 'GREATEST(posts.updated_at,' + + 'COALESCE(pt_max.max_updated_at, posts.updated_at))' + q = filtered_posts + .joins("LEFT JOIN (#{ pt_max_sql }) pt_max ON pt_max.post_id = posts.id") + .reselect('posts.*', Arel.sql("#{ updated_at_all_sql } AS updated_at_all")) .preload(tags: { tag_name: :wiki_page }) .with_attached_thumbnail @@ -45,8 +57,12 @@ class PostsController < ApplicationController end q = q.where('posts.created_at >= ?', created_between[0]) if created_between[0] q = q.where('posts.created_at <= ?', created_between[1]) if created_between[1] - q = q.where('posts.updated_at >= ?', updated_between[0]) if updated_between[0] - q = q.where('posts.updated_at <= ?', updated_between[1]) if updated_between[1] + if updated_between[0] + q = q.where("#{ updated_at_all_sql } >= ?", updated_between[0]) + end + if updated_between[1] + q = q.where("#{ updated_at_all_sql } <= ?", updated_between[1]) + end sort_sql = if order[0] == 'original_created_at' @@ -57,12 +73,12 @@ class PostsController < ApplicationController else "posts.#{ order[0] } #{ order[1] }" end - posts = q.select('posts.*') - .order(Arel.sql("#{ sort_sql }")) - .limit(limit).offset(offset).to_a + posts = q.order(Arel.sql("#{ sort_sql }")).limit(limit).offset(offset).to_a + + q = q.except(:select, :order) render json: { posts: posts.map { |post| - PostRepr.base(post).tap do |json| + PostRepr.base(post).merge(updated_at: post.updated_at_all).tap do |json| json['thumbnail'] = if post.thumbnail.attached? rails_storage_proxy_url(post.thumbnail, only_path: false)