| @@ -6,13 +6,11 @@ class NicoTagsController < ApplicationController | |||
| cursor = params[:cursor].presence | |||
| q = Tag.nico_tags | |||
| .joins(:tag_name) | |||
| .left_joins(tag_name: :wiki_page) | |||
| .includes(:tag_name, tag_name: :wiki_page, linked_tags: :tag_name) | |||
| .includes(:tag_name, tag_name: :wiki_page, linked_tags: { tag_name: :wiki_page }) | |||
| .order(updated_at: :desc) | |||
| q = q.where('tags.updated_at < ?', Time.iso8601(cursor)) if cursor | |||
| tags = q.limit(limit + 1) | |||
| tags = q.limit(limit + 1).to_a | |||
| next_cursor = nil | |||
| if tags.size > limit | |||
| @@ -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 | |||
| @@ -8,7 +8,6 @@ class TagsController < ApplicationController | |||
| else | |||
| Tag.joins(:tag_name) | |||
| end | |||
| .left_joins(tag_name: :wiki_page) | |||
| .includes(:tag_name, tag_name: :wiki_page) | |||
| if post_id.present? | |||
| tags = tags.where(posts: { id: post_id }) | |||
| @@ -39,7 +38,6 @@ class TagsController < ApplicationController | |||
| end | |||
| base = Tag.joins(:tag_name) | |||
| .left_joins(tag_name: :wiki_page) | |||
| .includes(:tag_name, tag_name: :wiki_page) | |||
| base = base.where('tags.post_count > 0') if present_only | |||
| @@ -66,7 +64,6 @@ class TagsController < ApplicationController | |||
| def show | |||
| tag = Tag.joins(:tag_name) | |||
| .left_joins(tag_name: :wiki_page) | |||
| .includes(:tag_name, tag_name: :wiki_page) | |||
| .find_by(id: params[:id]) | |||
| if tag | |||
| @@ -81,7 +78,6 @@ class TagsController < ApplicationController | |||
| return head :bad_request if name.blank? | |||
| tag = Tag.joins(:tag_name) | |||
| .left_joins(tag_name: :wiki_page) | |||
| .includes(:tag_name, tag_name: :wiki_page) | |||
| .find_by(tag_names: { name: }) | |||
| if tag | |||
| @@ -15,17 +15,17 @@ class WikiPagesController < ApplicationController | |||
| end | |||
| def show | |||
| page = WikiPage.joins(:tag_name, :wiki_revisions, wiki_revisions: :wiki_revision_lines) | |||
| .includes(:tag_name, :wiki_revisions, wiki_revisions: :wiki_revision_lines) | |||
| page = WikiPage.joins(:tag_name) | |||
| .includes(:tag_name) | |||
| .find_by(id: params[:id]) | |||
| render_wiki_page_or_404 page | |||
| end | |||
| def show_by_title | |||
| title = params[:title].to_s.strip | |||
| page = WikiPage.joins(:tag_name, :wiki_revisions, wiki_revisions: :wiki_revision_lines) | |||
| .includes(:tag_name, :wiki_revisions, wiki_revisions: :wiki_revision_lines) | |||
| .find_by(tag_names: { name: title }) | |||
| page = WikiPage.joins(:tag_name) | |||
| .includes(:tag_name) | |||
| .find_by(tag_name: { name: title }) | |||
| render_wiki_page_or_404 page | |||
| end | |||
| @@ -53,7 +53,7 @@ class WikiPagesController < ApplicationController | |||
| from = params[:from].presence | |||
| to = params[:to].presence | |||
| page = WikiPage.find(id) | |||
| page = WikiPage.joins(:tag_name).includes(:tag_name).find(id) | |||
| from_rev = from && page.wiki_revisions.find(from) | |||
| to_rev = to ? page.wiki_revisions.find(to) : page.current_revision | |||
| @@ -137,7 +137,9 @@ class WikiPagesController < ApplicationController | |||
| def changes | |||
| id = params[:id].presence | |||
| q = WikiRevision.includes(:wiki_page, :created_user).order(id: :desc) | |||
| q = WikiRevision.joins(wiki_page: :tag_name) | |||
| .includes(:created_user, wiki_page: :tag_name) | |||
| .order(id: :desc) | |||
| q = q.where(wiki_page_id: id) if id | |||
| render json: q.limit(200).map { |rev| | |||
| @@ -145,7 +147,7 @@ class WikiPagesController < ApplicationController | |||
| pred: rev.base_revision_id, | |||
| succ: nil, | |||
| wiki_page: { id: rev.wiki_page_id, title: rev.wiki_page.title }, | |||
| user: { id: rev.created_user.id, name: rev.created_user.name }, | |||
| user: rev.created_user && { id: rev.created_user.id, name: rev.created_user.name }, | |||
| kind: rev.kind, | |||
| message: rev.message, | |||
| timestamp: rev.created_at } | |||
| @@ -30,13 +30,15 @@ class Post < ApplicationRecord | |||
| super(options).merge(thumbnail: nil) | |||
| end | |||
| def related(limit: nil) | |||
| ids = post_similarities.select(:target_post_id).order(cos: :desc) | |||
| def related limit: nil | |||
| ids = post_similarities.order(cos: :desc) | |||
| ids = ids.limit(limit) if limit | |||
| ids = ids.pluck(:target_post_id) | |||
| return [] if ids.empty? | |||
| return Post.none if ids.empty? | |||
| Post.where(id: ids).order(Arel.sql("FIELD(id, #{ ids.join(',') })")) | |||
| Post.where(id: ids) | |||
| .with_attached_thumbnail | |||
| .order(Arel.sql("FIELD(posts.id, #{ ids.join(',') })")) | |||
| end | |||
| def resized_thumbnail! | |||
| @@ -25,6 +25,8 @@ class Tag < ApplicationRecord | |||
| has_many :tag_similarities, dependent: :delete_all | |||
| belongs_to :tag_name | |||
| delegate :wiki_page, to: :tag_name | |||
| delegate :name, to: :tag_name, allow_nil: true | |||
| validates :tag_name, presence: true | |||
| @@ -56,7 +58,7 @@ class Tag < ApplicationRecord | |||
| end | |||
| def has_wiki | |||
| tag_name&.wiki_page.present? | |||
| wiki_page.present? | |||
| end | |||
| def self.tagme | |||