Я обновил 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