Rails 5 Postgres-用一个标签替换多个标签来替换所有资源?

时间:2018-10-06 17:07:15

标签: ruby-on-rails acts-as-taggable-on

我最近将一堆模型迁移到一个伞形模型,问题是所有旧模型的tag_list都迁移为一个长字符串,而不是带分隔符的标签。

例如:

Post.tag_list = "popcorn, salty, butter" 

以以下方式转到新模型:

"popcorn salty butter"

我在rails中进行了此SQL迁移

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的资源:popcornsaltybutter-如何使用上面的代码?由于它的工作原理类似,但是添加了双引号,这使该应用无法用于标签搜索。

我正在使用行为作为可标记和导轨5.1.6。

1 个答案:

答案 0 :(得分:1)

创建标签popcornsaltybutter(而不是重命名标签)必须分别作为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 gem,则代码如下:

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