Replace a string in all posts

Topics.where(category_id: 123).each do |t|
  posts.where(topic_id: t).each do |p|
    p.raw.gsub!("replaceme", "/")
    p.save
  end
end
./launcher enter app
rails c
# вставьте содержимое

Сначала лучше сделать резервную копию.

2 лайка

Спасибо, Джей, ценю твое время!

И я на собственном горьком опыте усвоил, что нужно делать резервную копию перед тем, как приступить к серьёзным действиям :slight_smile:

Обновление: Всё сработало отлично, но пришлось использовать \n вместо /.

Кроме того, в коде выше указаны Topic и Post :slight_smile:

Хорошая идея — выполнить пересборку (rebake) после запуска этого скрипта. В моём случае это потребовалось для пересоздания миниатюр.

2 лайка

Пост был объединён с существующей темой: Замена содержимого в нескольких темах с помощью регулярных выражений?

Привет @nathank! Интересно, нашёл ли ты решение на стороне upstream для этой проблемы. Мы столкнулись с похожей ситуацией, где хотели бы (по сути) автоматически заменять «X» на «Y» каждый раз, когда пользователь упоминает «X» в своей теме или сообщении.

В этом и заключается функция отслеживаемых слов. Она будет заменять строки при создании или редактировании сообщения.

/admin/customize/watched_words

1 лайк

Спасибо, Джей! Похоже, это работает для последовательностей на основе символов, но не для форматирования без символов, такого как отступы с помощью табуляции.

Сценарии использования: у нас есть некоторые старые авторы на нашей платформе, которые до сих пор относятся к клавиатуре как к печатной машинке и нажимают пробел пять раз для отступа. Другие авторы копируют и вставляют текст с отступом через табуляцию. Оба этих случая приводят к тому, что Discourse интерпретирует это как разметку. (Если я правильно использую этот термин.)

Нашёл обходной путь на стороне компонента темы, где мы заставили CSS фактически переопределить форматирование разметки, которое нам никогда не нужно для нашего конкретного случая использования.

Всего наилучшего и спасибо за помощь!

2 лайка

Если я хочу удалить[JUSTIFY], правильно ли это?

rake ‘posts:delete_word[[JUSTIFY]]’

Я использовал следующую команду для замены тегов [HEADING], которые не были преобразованы при миграции с XenForo:

sudo -u discourse -H RAILS_ENV=production bundle exec rails runner '
Post.where("raw LIKE ?", "%[HEADING%").find_each(batch_size: 500) do |p|
  orig = p.raw
  cooked = orig.dup
  (1..6).each do |lvl|
    cooked.gsub!(/\[HEADING=#{lvl}\](.*?)\[\/HEADING\]/mi) { "#" * lvl + " " + $1 }
  end
  cooked.gsub!(/\[HEADING\](.*?)\[\/HEADING\]/mi) { "## " + $1 }
  next if cooked == orig
  p.raw = cooked
  p.save!(validate: false)   # Запуск rebake, но без проверки
end
puts "Теги HEADING преобразованы и переобработаны."
'
2 лайка