ぼざクリタグ広場 https://hub.nizika.monster
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

92 lines
2.5 KiB

  1. class CreateWikiVersions < ActiveRecord::Migration[8.0]
  2. class WikiPage < ActiveRecord::Base
  3. self.table_name = 'wiki_pages'
  4. end
  5. class WikiRevision < ActiveRecord::Base
  6. self.table_name = 'wiki_revisions'
  7. end
  8. class WikiRevisionLine < ActiveRecord::Base
  9. self.table_name = 'wiki_revision_lines'
  10. end
  11. class WikiLine < ActiveRecord::Base
  12. self.table_name = 'wiki_lines'
  13. end
  14. class WikiVersion < ActiveRecord::Base
  15. self.table_name = 'wiki_versions'
  16. end
  17. class TagName < ActiveRecord::Base
  18. self.table_name = 'tag_names'
  19. end
  20. def up
  21. add_column :wiki_pages, :body, :text, after: :tag_name_id
  22. create_table :wiki_versions do |t|
  23. t.references :wiki_page , null: false, foreign_key: true
  24. t.integer :version_no, null: false
  25. t.string :event_type, null: false
  26. t.string :title, null: false
  27. t.text :body, null: false
  28. t.text :reason
  29. t.datetime :created_at, null: false
  30. t.references :created_by_user, foreign_key: { to_table: :users }
  31. t.index [:wiki_page_id, :version_no], unique: true
  32. t.check_constraint 'version_no > 0',
  33. name: 'wiki_versions_version_no_positive'
  34. t.check_constraint "event_type IN ('create', 'update', 'discard', 'restore')",
  35. name: 'wiki_versions_event_type_valid'
  36. end
  37. WikiPage.reset_column_information
  38. WikiVersion.reset_column_information
  39. say_with_time 'Backfilling wiki_versions' do
  40. WikiPage.find_each do |page|
  41. base_revision_id = nil
  42. version_no = 1
  43. title = TagName.find(page.tag_name_id).name
  44. body = nil
  45. loop do
  46. rev = WikiRevision.where(wiki_page_id: page.id).find_by(base_revision_id:)
  47. break unless rev
  48. body = WikiRevisionLine.where(wiki_revision_id: rev.id).order(:position).map { |wrl|
  49. WikiLine.find(wrl.wiki_line_id).body
  50. }.join("\n")
  51. WikiVersion.create!(
  52. wiki_page_id: page.id,
  53. version_no:,
  54. event_type: version_no == 1 ? 'create' : 'update',
  55. title:,
  56. body:,
  57. reason: rev.message,
  58. created_at: rev.created_at,
  59. created_by_user_id: rev.created_user_id)
  60. version_no += 1
  61. base_revision_id = rev.id
  62. end
  63. if body
  64. page.update!(body:)
  65. else
  66. page.destroy!
  67. end
  68. end
  69. end
  70. change_column_null :wiki_pages, :body, false
  71. end
  72. def down
  73. drop_table :wiki_versions
  74. remove_column :wiki_pages, :body
  75. end
  76. end