Ruby on Rails: миграция переопределения PostgreSQL / Capistrano при развертывании - PullRequest
0 голосов
/ 12 июня 2018

Я обновил Rails, Spree (фреймворк электронной коммерции) и добавил несколько новых драгоценных камней.Все это необходимо перенести после обновления и установки.В приложении для разработки я столкнулся с проблемой.Всякий раз, когда я пытался выполнить миграцию, я получал сообщение об ошибке

Проблема

ActiveRecord :: StatementInvalid: PG :: DuplicateTable: ERROR: отношение "index_products_promotion_rules_on_product_id" уже существует: CREATE INDEX "index_products_promotion_rules_on_product_id" ON "spree_products_promotion_rules" ("product_id")

Я решил эту проблему, удалив свою базу данных (БД) и создав новую.Так как это режим разработки, это не проблема потери некоторых данных, хранящихся в БД.

Теперь я использую PostgreSQL в качестве моей БД и Capistrano для развертывания моего приложения.

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

Я пытался удалитьлиния от migration file и schema.rb, но это не помогло.

Вопросы:

Теперь мне стало интересно, могу ли я переопределить текущие таблицы на живом сервере?

Сохраняется ли удаление строк из migration file и schema.rb?

Или есть другой способ решить эту проблему?

schema.rb

  create_table "spree_product_promotion_rules", force: :cascade do |t|
    t.integer "product_id"
    t.integer "promotion_rule_id"
    t.index ["product_id"], name: "index_products_promotion_rules_on_product_id"
    t.index ["promotion_rule_id", "product_id"], name: "index_products_promotion_rules_on_promotion_rule_and_product"

Файл миграции

# This migration comes from spree (originally 20120831092359)
class SpreePromoOneTwo < ActiveRecord::Migration[4.2]
  def up

    # This migration is just a compressed migration for all previous versions of spree_promo
    return if table_exists?(:spree_products_promotion_rules)

    create_table :spree_products_promotion_rules, :id => false, :force => true do |t|
      t.references :product
      t.references :promotion_rule
    end

    add_index :spree_products_promotion_rules, [:product_id], :name => 'index_products_promotion_rules_on_product_id'
    add_index :spree_products_promotion_rules, [:promotion_rule_id], :name => 'index_products_promotion_rules_on_promotion_rule_id'

    create_table :spree_promotion_actions, force: true do |t|
      t.references :activator
      t.integer    :position
      t.string     :type
    end

    create_table :spree_promotion_rules, force: true do |t|
      t.references :activator
      t.references :user
      t.references :product_group
      t.string     :type
      t.timestamps null: false
    end

    add_index :spree_promotion_rules, [:product_group_id], name: 'index_promotion_rules_on_product_group_id'
    add_index :spree_promotion_rules, [:user_id], name: 'index_promotion_rules_on_user_id'

    create_table :spree_promotion_rules_users, id: false, force: true do |t|
      t.references :user
      t.references :promotion_rule
    end

    add_index :spree_promotion_rules_users, [:promotion_rule_id], name: 'index_promotion_rules_users_on_promotion_rule_id'
    add_index :spree_promotion_rules_users, [:user_id], name: 'index_promotion_rules_users_on_user_id'
  end
end

1 Ответ

0 голосов
/ 18 июня 2018

В конечном итоге я скачал базу данных, чтобы попытаться выполнить локальную миграцию.Я изменил файлы, удалив уже существующие строки и выполнив команду rails db: migrate, до тех пор, пока я больше не получу сообщение об ошибке.

...