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' 的新标签名称。您可以根据需要更改此值。我希望这个解决方案足够好。
注意:您可以在一次迁移中写入多行以在一次迁移中更新多个标签。
所以我正在尝试根据旧标签使用新标签更新我的任何相关资源。
任何标有 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' 的新标签名称。您可以根据需要更改此值。我希望这个解决方案足够好。
注意:您可以在一次迁移中写入多行以在一次迁移中更新多个标签。