【问题标题】:Rails 5 Postgres - replace all resource with one tag with multiple tags?Rails 5 Postgres - 用一个标签替换所有资源和多个标签?
【发布时间】:2018-10-06 17:07:15
【问题描述】:

我最近将一堆模型迁移到一个伞形模型,问题是所有旧模型的 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 的行为。

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 谢谢!这是否必须在控制台或迁移文件中运行?
    • 迁移用于数据库结构更改。此代码可以在控制台中运行。
    • 我没有标签模型,因为我使用的行为是可标记的。[1] pry(main)> tags = %w[popcorn salty butter].map do |tag| [1] pry(main)* Tag.find_or_create_by(name: tag) [1] pry(main)* end NameError: uninitialized constant Tag from (pry):2:in `block in __pry__'
    • 对不起,我不熟悉那个宝石。你能分享一个链接到它的回购吗?
    • 谢谢,我更新了我的答案。基本上,该 gem 的文档包含管理标签的所有内容。
    猜你喜欢
    • 2013-05-26
    • 2013-11-23
    • 2015-06-24
    • 2015-08-15
    • 1970-01-01
    • 2011-10-28
    • 2020-01-17
    • 2012-03-13
    相关资源
    最近更新 更多