| @@ -30,8 +30,20 @@ class PostsController < ApplicationController | |||||
| offset = (page - 1) * limit | 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 = | q = | ||||
| filtered_posts | 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 }) | .preload(tags: { tag_name: :wiki_page }) | ||||
| .with_attached_thumbnail | .with_attached_thumbnail | ||||
| @@ -45,8 +57,12 @@ class PostsController < ApplicationController | |||||
| end | end | ||||
| q = q.where('posts.created_at >= ?', created_between[0]) if created_between[0] | 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.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 = | sort_sql = | ||||
| if order[0] == 'original_created_at' | if order[0] == 'original_created_at' | ||||
| @@ -57,12 +73,12 @@ class PostsController < ApplicationController | |||||
| else | else | ||||
| "posts.#{ order[0] } #{ order[1] }" | "posts.#{ order[0] } #{ order[1] }" | ||||
| end | 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| | 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'] = | json['thumbnail'] = | ||||
| if post.thumbnail.attached? | if post.thumbnail.attached? | ||||
| rails_storage_proxy_url(post.thumbnail, only_path: false) | rails_storage_proxy_url(post.thumbnail, only_path: false) | ||||