Rails 5 тегов ActsAsTaggable Mass Update в консоли rails? - PullRequest
0 голосов
/ 05 октября 2018

Поэтому я пытаюсь обновить любой из моих соответствующих ресурсов новым тегом, основываясь на том, что старый.

Любое сообщение с тегом 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: ОШИБКА: столбец «тег» отношения «множественные_четы-запросы» не существует ЛИНИЯ 1: ОБНОВЛЕНИЕ «множественные-выборки-запросы» SET-тег «=» 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

1 Ответ

0 голосов
/ 06 октября 2018

Хорошо, давайте закончим эту задачу:

Я действительно не мог найти лучшего решения для обновления тега внутри этого драгоценного камня 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'.Вы можете изменить эти значения в соответствии с вашими потребностями.Я надеюсь, что это решение достаточно хорошее.

Примечание. Вы можете написать много строк в одной миграции, чтобы обновить много тегов в одной миграции.

enter image description here

...