nas/db/migrate/20240312230204_create_sensitive_words.rb
KMY(雪あすか) ed246f0d03
Change: #648 センシティブワードの入力フォーム (#653)
* Change: #648 センシティブワードの入力フォーム

* Wip: 行の追加削除

* Wip: 設定の保存、マイグレーション

* 不要な処理を削除

* マイグレーションコード調整
2024-03-19 08:18:34 +09:00

71 lines
3 KiB
Ruby

# frozen_string_literal: true
class CreateSensitiveWords < ActiveRecord::Migration[7.1]
class Setting < ApplicationRecord
def value
YAML.safe_load(self[:value], permitted_classes: [ActiveSupport::HashWithIndifferentAccess, Symbol]) if self[:value].present?
end
def value=(new_value)
self[:value] = new_value.to_yaml
end
end
class SensitiveWord < ApplicationRecord; end
def normalized_keyword(keyword)
if regexp?(keyword)
keyword[1..]
else
keyword
end
end
def regexp?(keyword)
keyword.start_with?('?') && keyword.size >= 2
end
def up
create_table :sensitive_words do |t|
t.string :keyword, null: false
t.boolean :regexp, null: false, default: false
t.boolean :remote, null: false, default: false
t.boolean :spoiler, null: false, default: true
t.timestamps
end
settings = Setting.where(var: %i(sensitive_words sensitive_words_for_full sensitive_words_all sensitive_words_all_for_full))
sensitive_words = settings.find { |s| s.var == 'sensitive_words' }&.value&.compact_blank&.uniq || []
sensitive_words_for_full = settings.find { |s| s.var == 'sensitive_words_for_full' }&.value&.compact_blank&.uniq || []
sensitive_words_all = settings.find { |s| s.var == 'sensitive_words_all' }&.value&.compact_blank&.uniq || []
sensitive_words_all_for_full = settings.find { |s| s.var == 'sensitive_words_all_for_full' }&.value&.compact_blank&.uniq || []
(sensitive_words + sensitive_words_for_full + sensitive_words_all + sensitive_words_all_for_full).compact.uniq.each do |word|
SensitiveWord.create!(
keyword: normalized_keyword(word),
regexp: regexp?(word),
remote: (sensitive_words_all + sensitive_words_all_for_full).include?(word),
spoiler: (sensitive_words_for_full + sensitive_words_all_for_full).include?(word)
)
end
settings.destroy_all
end
def down
sensitive_words = SensitiveWord.where(remote: false, spoiler: false).map { |s| s.regexp ? "?#{s.keyword}" : s.keyword }
sensitive_words_for_full = SensitiveWord.where(remote: false, spoiler: true).map { |s| s.regexp ? "?#{s.keyword}" : s.keyword }
sensitive_words_all = SensitiveWord.where(remote: true, spoiler: false).map { |s| s.regexp ? "?#{s.keyword}" : s.keyword }
sensitive_words_all_for_full = SensitiveWord.where(remote: true, spoiler: true).map { |s| s.regexp ? "?#{s.keyword}" : s.keyword }
Setting.where(var: %i(sensitive_words sensitive_words_for_full sensitive_words_all sensitive_words_all_for_full)).destroy_all
Setting.new(var: :sensitive_words).tap { |s| s.value = sensitive_words }.save!
Setting.new(var: :sensitive_words_for_full).tap { |s| s.value = sensitive_words_for_full }.save!
Setting.new(var: :sensitive_words_all).tap { |s| s.value = sensitive_words_all }.save!
Setting.new(var: :sensitive_words_all_for_full).tap { |s| s.value = sensitive_words_all_for_full }.save!
drop_table :sensitive_words
end
end