|
- require 'set'
-
-
- class WikiPage < ApplicationRecord
- has_many :wiki_revisions, dependent: :destroy
- belongs_to :created_user, class_name: 'User'
- belongs_to :updated_user, class_name: 'User'
-
- has_many :redirected_from_revisions,
- class_name: 'WikiRevision',
- foreign_key: :redirect_page_id,
- dependent: :nullify
-
- validates :title, presence: true, length: { maximum: 255 }, uniqueness: true
-
- def current_revision
- wiki_revisions.order(id: :desc).first
- end
-
- def body
- rev = current_revision
- rev.body if rev&.content?
- end
-
- def resolve_redirect limit: 10
- page = self
- visited = Set.new
-
- limit.times do
- return page if visited.include?(page.id)
-
- visited.add(page.id)
-
- rev = page.current_revision
- return page if !(rev&.redirect?) || !(rev.redirect_page)
-
- page = rev.redirect_page
- end
-
- page
- end
-
- def pred_revision_id revision_id
- wiki_revisions.where('id < ?', revision_id).order(id: :desc).limit(1).pick(:id)
- end
-
- def succ_revision_id revision_id
- wiki_revisions.where('id > ?', revision_id).order(id: :asc).limit(1).pick(:id)
- end
- end
|