Rails 5 Postgres - заменить весь ресурс одним тегом с несколькими тегами? - PullRequest
0 голосов
/ 06 октября 2018

Я недавно перенес несколько групп моделей в одну зонтичную модель, и проблема в том, что tag_list для всех старых моделей мигрировал как длинная строка, а не как теги с разделителями.

Например:

Post.tag_list = "popcorn, salty, butter" 

перешел к новой модели как:

"popcorn salty butter"

У меня есть эта миграция SQL в rails

execute("UPDATE tags SET name='popcorn, salty, butter' WHERE LOWER(name) LIKE 'movie popcorn' ESCAPE '!';")

Это работает, но мое приложение rails заменяетвсе ресурсы с тегом movie popcorn с одной длинной строкой -> "popcorn, salty, butter", когда я просто хочу popcorn, salty, butter - обратите внимание на двойные кавычки (мне не нужна строка двойных кавычек, как мояприложение использует запятые в качестве разделителя для обозначения нескольких тегов)

Я хочу заменить все ресурсы, имеющие тег (ы) movie popcorn на три тега вместо: popcorn, salty и butter -Как я могу сделать это с помощью приведенного выше кода?Поскольку он работает аналогично, но с добавлением двойных кавычек, что не позволяет приложению функционировать для поиска по тегам.

Я использую действия как taggable и rails 5.1.6.

1 Ответ

0 голосов
/ 06 октября 2018

Вместо переименования тега необходимо создать теги popcorn, salty и butter, каждый в виде отдельной записи таблицы tags, а затем обновить свои ресурсы.Для одного бегуна это может выглядеть следующим образом:

tags = %w[popcorn salty butter].map do |tag|
  Tag.find_or_create_by(name: tag)
end
Post.joins(:tags).where("tags.name = 'movie popcorn'").each do |post|
  post.tags = tags
end

Миграции там не помогут.

ОБНОВЛЕНИЕ: В случае использования гема acts_as_taggable_on код будетвыглядеть так:

Post.tagged_with('movie popcorn').each do |post|
  post.tag_list = "popcorn, salty, butter"
  post.save
end
...