Rails 5 Postgres - 用一个标签替换所有资源到多个标签?
Rails 5 Postgres - replace all resource with one tag with multiple tags?
我最近将一堆模型迁移到一个伞形模型,问题是所有旧模型的 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
的资源:popcorn
、salty
和 butter
- 我该怎么做那用上面的代码?由于功能类似,只是加了双引号,导致应用无法搜索标签。
我正在使用 acts as taggable 和 rails 5.1.6.
无需重命名标签,而是需要创建标签 popcorn
、salty
和 butter
,每个标签作为 tags
table 的单个记录,然后更新你的资源。单人跑步者可能看起来像:
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
我最近将一堆模型迁移到一个伞形模型,问题是所有旧模型的 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
的资源:popcorn
、salty
和 butter
- 我该怎么做那用上面的代码?由于功能类似,只是加了双引号,导致应用无法搜索标签。
我正在使用 acts as taggable 和 rails 5.1.6.
无需重命名标签,而是需要创建标签 popcorn
、salty
和 butter
,每个标签作为 tags
table 的单个记录,然后更新你的资源。单人跑步者可能看起来像:
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