Rails 5 Теги ActsAsTaggable Mass Update в консоли rails?

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

Я хочу обновить любое сообщение с тегом test, чтобы все сообщения с тегом test теперь были помечены, например, new-testing-tag.

Мой другой вопрос: если у меня есть несколько тегов, связанных с сообщением, и я просто хочу обновить один из них, будет ли процесс таким же?

например: сообщение имеет теги «javascript» и «премиум» — я просто хочу изменить «премиум» на бесплатно. Это возможно?

попробовал все это в консоли рельсов

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: ОШИБКА: столбец «тег» отношения «multiple_choice_questions» не существует LINE 1: UPDATE «multiple_choice_questions» SET «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

person mazing    schedule 05.10.2018    source источник
comment
хм, вы можете проверить свою БД и посмотреть, есть ли таблица тегов, а внутри таблицы постов просто какое-то поле ссылочного тега?   -  person Nezir    schedule 05.10.2018
comment
@Nezir Я обновил свой вопрос, указав содержимое моей схемы!   -  person mazing    schedule 05.10.2018
comment
Проверяя документацию по драгоценным камням, я не вижу опции для update_all, поэтому я думаю, вам нужно будет сделать это вручную в таблице тегов. В этом случае вы можете сгенерировать новую миграцию и написать код, чтобы найти каждый тег с тестом и обновить его во что-то другое.   -  person Nezir    schedule 05.10.2018
comment
@Nezir Есть идеи, как это сделать?   -  person mazing    schedule 05.10.2018
comment
Вы можете проверить, есть ли «тестовые» значения внутри таблицы тегов? или любой тег значения, который вы хотите обновить, находится ли он в таблице тегов?   -  person Nezir    schedule 05.10.2018
comment
Если я сделаю это в консоли rails Post.tagged_with("test"), это сработает @Nezir   -  person mazing    schedule 06.10.2018
comment
Да, это сработает, потому что tagged_with — это гем-метод для получения тега, но вы должны зайти в консоль rails c или открыть таблицу db с какой-нибудь ide db для sqlite или pgadmin для средства просмотра db postgreql.   -  person Nezir    schedule 06.10.2018


Ответы (1)


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

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

Примечание: вы можете написать много строк за одну миграцию, чтобы обновить много тегов за одну миграцию.

введите здесь описание изображения

person Nezir    schedule 06.10.2018
comment
получаю эту ошибку: \ ======================================= -- execute("UPDATE tags SET name='semester5, pharmacology, blood' WHERE LOWER('tags'.'name') LIKE 'test' ESCAPE '!';") rake aborted! StandardError: An error has occurred, this and all later migrations canceled: PG::SyntaxError: ERROR: syntax error at or near "." LINE 1: ...semester5, pharmacology, blood' WHERE LOWER('tags'.'name') L... ^ : UPDATE tags SET name='semester5, pharmacology, blood' WHERE LOWER('tags'.'name') LIKE 'test' ESCAPE '!'; - person mazing; 06.10.2018
comment
посмотрите, вам нужно будет установить каждый тег в одной строке, попробуйте обновить только одно имя «semester5» и скопировать строку вставки ниже для других - person Nezir; 06.10.2018
comment
или попробуйте без , между тегами, такими как выполнить (ОБНОВЛЕНИЕ тегов SET name = 'semester5 фармакологическая кровь' WHERE LOWER ('теги'.'имя') LIKE 'test' ESCAPE '!';) - person Nezir; 06.10.2018
comment
не уверен, что происходит на вашей стороне, но это работает на моей стороне, проверьте скриншот в моем ответе - person Nezir; 06.10.2018
comment
это потому, что вы используете SQLite? Я использую PG в среде разработки - person mazing; 06.10.2018
comment
хм да, это может быть разница, извините, я не могу сейчас использовать postgres, но можете ли вы проверить различия postgresql в написании запроса на обновление между sqlite и postgres - person Nezir; 06.10.2018
comment
вообще попробуй убрать этот ESCAPE '!' и запустите снова, а также вы можете проверить «запрос на обновление postgresql, где нравится» только для точного формата запроса, специфичного для psql - person Nezir; 06.10.2018
comment
это работает, но добавляет двойную кавычку в начало и конец моей новой строки замены. например, я хочу semester5, pharmacology, blood в качестве замены, но ПОЛУЧАЮ "semester5, pharmacology, blood" какие-нибудь идеи? - person mazing; 06.10.2018
comment
google.ba/ - person Nezir; 06.10.2018