首页 > 解决方案 > Rails 控制台中的 Rails 5 ActsAsTaggable 批量更新标签?

问题描述

因此,我正在尝试使用新标签更新我的任何相关资源,基于旧标签。

任何带有 标记的帖子test,我都想对其进行更新,以便所有那些带有 test 标记的帖子现在都将被标记new-testing-tag为例如。

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

例如:帖子有标签“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")

但他们都没有工作,他们都把这个扔回去:ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "tag" of relationship "multiple_choice_questions" 不存在 LINE 1: UPDATE "multiple_choice_questions" SET "tag" = '测试2'在哪里...

这是在我的 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

标签: ruby-on-railsacts-as-taggable-on

解决方案


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

我真的找不到更好的解决方案来更新这个 gem ActsAsTaggableOn 中的标签,但是正如我之前在上面的评论中所想的那样,我们可以通过使用 rails 迁移和使用普通 SQL 更新标签名称来完成这项工作。

所以,我是这样做的: 1 - rails g migration UpdateTags (在终端中我运行这个命令来生成新的迁移文件) 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”的新标签名称。您可以根据需要更改此值。我希望这个解决方案足够好。

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

在此处输入图像描述


推荐阅读