ruby-on-rails - 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
解决方案
好的,让我们完成这个任务:
我真的找不到更好的解决方案来更新这个 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”的新标签名称。您可以根据需要更改此值。我希望这个解决方案足够好。
注意:您可以在一次迁移中编写多行以在一次迁移中更新多个标签。
推荐阅读
- windows - Spring Boot 应用程序在 Windows 10 上启动,但在 OS X (HS) 上不启动
- php - 将变量返回到视图
- reactjs - React-bootstrap:一行中的两列未呈现
- python - 从 beautifulsoup 结果中删除HTML 标记
- css - Bootstrap 3输入组插件丢失标记
- r - R:如何以递归方式将文本文件读入列表列表?
- php - 在 symfony4 中为 redis 设置无键前缀
- firebase - 如何使用 firebase cli 将文件推送到 firebase 存储
- swift - 部分中选定行的索引
- azure-ad-b2c - Azure AD B2C - 身份框架体验时间表