|
- class CreateWikiVersions < ActiveRecord::Migration[8.0]
- class WikiPage < ActiveRecord::Base
- self.table_name = 'wiki_pages'
- end
-
- class WikiRevision < ActiveRecord::Base
- self.table_name = 'wiki_revisions'
- end
-
- class WikiRevisionLine < ActiveRecord::Base
- self.table_name = 'wiki_revision_lines'
- end
-
- class WikiLine < ActiveRecord::Base
- self.table_name = 'wiki_lines'
- end
-
- class WikiVersion < ActiveRecord::Base
- self.table_name = 'wiki_versions'
- end
-
- class TagName < ActiveRecord::Base
- self.table_name = 'tag_names'
- end
-
- def up
- add_column :wiki_pages, :body, :text, after: :tag_name_id
-
- create_table :wiki_versions do |t|
- t.references :wiki_page , null: false, foreign_key: true
- t.integer :version_no, null: false
- t.string :event_type, null: false
- t.string :title, null: false
- t.text :body, null: false
- t.text :reason
- t.datetime :created_at, null: false
- t.references :created_by_user, foreign_key: { to_table: :users }
-
- t.index [:wiki_page_id, :version_no], unique: true
- t.check_constraint 'version_no > 0',
- name: 'wiki_versions_version_no_positive'
- t.check_constraint "event_type IN ('create', 'update', 'discard', 'restore')",
- name: 'wiki_versions_event_type_valid'
- end
-
- WikiPage.reset_column_information
- WikiVersion.reset_column_information
-
- say_with_time 'Backfilling wiki_versions' do
- WikiPage.find_each do |page|
- base_revision_id = nil
- version_no = 1
- title = TagName.find(page.tag_name_id).name
- body = nil
- loop do
- rev = WikiRevision.where(wiki_page_id: page.id).find_by(base_revision_id:)
- break unless rev
-
- body = WikiRevisionLine.where(wiki_revision_id: rev.id).order(:position).map { |wrl|
- WikiLine.find(wrl.wiki_line_id).body
- }.join("\n")
-
- WikiVersion.create!(
- wiki_page_id: page.id,
- version_no:,
- event_type: version_no == 1 ? 'create' : 'update',
- title:,
- body:,
- reason: rev.message,
- created_at: rev.created_at,
- created_by_user_id: rev.created_user_id)
-
- version_no += 1
- base_revision_id = rev.id
- end
- if body
- page.update!(body:)
- else
- page.destroy!
- end
- end
- end
-
- change_column_null :wiki_pages, :body, false
- end
-
- def down
- drop_table :wiki_versions
- remove_column :wiki_pages, :body
- end
- end
|