Rails rails 控制台中的 5 个 ActsAsTaggable 批量更新标签?

Rails 5 ActsAsTaggable Mass Update tags in rails console?

所以我正在尝试根据旧标签使用新标签更新我的任何相关资源。

任何标有 test 的 Post,我想对其进行更新,以便所有标有测试的 Post 现在都标有 new-testing-tag 例如。

我的另一个问题是,如果我有多个标签与 Post 相关联,而我只想更新其中一个,过程是否相同?

例如:Post 有标签 "javascript" 和 "premium" -- 我只想将 "premium" 更改为免费。这可能吗?

尝试了所有这些,在 rails 控制台

Post.tagged_with("test").update_all(tag: "new-testing-tag")
Post.tagged_with("test").update_all(tags: "test2")
Post.tagged_with("test").update_all(tag_list: "test2")

none 他们虽然工作了,但他们都把这个扔回去:ActiveRecord::StatementInvalid:PG::UndefinedColumn:错误:关系 "multiple_choice_questions" 的列 "tag" 确实不存在 第 1 行:更新 "multiple_choice_questions" 设置 "tag" = 'test2' 其中...

这在我的 schema.db 文件中

  create_table "taggings", force: :cascade do |t|
    t.bigint "tag_id"
    t.string "taggable_type"
    t.bigint "taggable_id"
    t.string "tagger_type"
    t.bigint "tagger_id"
    t.string "context", limit: 128
    t.datetime "created_at"
    t.index ["context"], name: "index_taggings_on_context"
    t.index ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true
    t.index ["tag_id"], name: "index_taggings_on_tag_id"
    t.index ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context"
    t.index ["taggable_id", "taggable_type", "tagger_id", "context"], name: "taggings_idy"
    t.index ["taggable_id"], name: "index_taggings_on_taggable_id"
    t.index ["taggable_type", "taggable_id"], name: "index_taggings_on_taggable_type_and_taggable_id"
    t.index ["taggable_type"], name: "index_taggings_on_taggable_type"
    t.index ["tagger_id", "tagger_type"], name: "index_taggings_on_tagger_id_and_tagger_type"
    t.index ["tagger_id"], name: "index_taggings_on_tagger_id"
    t.index ["tagger_type", "tagger_id"], name: "index_taggings_on_tagger_type_and_tagger_id"
  end

  create_table "tags", force: :cascade do |t|
    t.string "name"
    t.integer "taggings_count", default: 0
    t.index ["name"], name: "index_tags_on_name", unique: true
  end

好的,让我们完成这个任务:

我真的找不到更好的解决方案来更新这个 gem ActsAsTaggableOn 中的标签,但正如我之前在上面的评论中所假设的那样,我们可以通过使用 rails 迁移和用普通 SQL.

更新标签名称

所以,我是这样做的: 1 - rails g migration UpdateTags (在终端 I 运行 此命令生成新的迁移文件) 2 - 打开生成的迁移并编写代码:

    class UpdateTags < ActiveRecord::Migration[5.2]
     def change
      execute "UPDATE tags SET name='somenewtag' WHERE LOWER('tags'.'name') LIKE 'rubyonrails.ba' ESCAPE '!';" 
     end
    end

3 - 保存文件并 运行 rails db:migrate

正如您在 sql 命令中看到的那样,我的目标是将名称值为 'rubyonrails.ba' 的所有标签更新为值为 'somenewtag' 的新标签名称。您可以根据需要更改此值。我希望这个解决方案足够好。

注意:您可以在一次迁移中写入多行以在一次迁移中更新多个标签。