1

Я пытаюсь удалить несколько строк в таблице actionable_items с помощью следующей миграции. Я отлаживал и могу подтвердить, что переменные, которые хранят строку таблицы, не ноль. Миграция выполняется успешно, но она не удаляет строку из таблицы. Кроме того, кто-нибудь знает, почему я могу отлаживать миграцию, когда я запускаю rake db:migrate:redo, но не когда я запускаю rake db:migrate?Rails удалить строку таблицы с помощью миграции

class RemoveActionableItems < ActiveRecord::Migration 
    class ActionableItem < ActiveRecord::Base 
    attr_accessible :actionable_item, :name, :sequence, :type 
    end 

    class MenuItemTEMP < ActionableItem 
    self.table_name = "actionable_items" 
    end 

    class InsightReportMenuItemTEMP < ActionableItem 
    self.table_name = "actionable_items" 
    end 

    def up 
    validation_settings = MenuItem.find_by_name("Validation Settings") 
    identifier_lookup = MenuItem.find_by_name("Identifier Lookup") 
    compliance = InsightReportMenuItem.find_by_name("Compliance") 
    debugger 
    validation_settings.destroy! #unless validation_settings.nil? 
    identifier_lookup.destroy! #unless identifier_lookup.nil? 
    compliance.destroy! #unless compliance.nil? 
    end 

    def down 
    MenuItem.create :name => "Validation Settings", :type => "MenuItem" 
    MenuItem.create :name => "Identifier Lookup", :type => "MenuItem" 
    InsightReportMenuItem.create :name => "Compliance", :type => "InsightReportMenuItem" 
    end 
end 

Я также попытался удалить из консоли рельсы, но еще раз, pgAdmin показывает строка не удаляется.

pmpaware-webapp(development)> compliance = InsightReportMenuItem.find_by_name("Compliance") 
    InsightReportMenuItem Load (3.8ms) SELECT "actionable_items".* FROM "actionable_items" WHERE "actionable_items"."type" IN ('InsightReportMenuItem') AND "actionable_items"."name" = 'Compliance' LIMIT 1 
=> #<InsightReportMenuItem id: 264, name: "Compliance", actionable_item_id: nil, created_at: "2015-07-23 18:57:25", updated_at: "2015-07-23 18:57:25", actionable_items_count: 0, sequence: nil, type: "InsightReportMenuItem"> 
pmpaware-webapp(development)> compliance.errors 
=> #<ActiveModel::Errors:0x007fc0735ac540 @base=#<InsightReportMenuItem id: 264, name: "Compliance", actionable_item_id: nil, created_at: "2015-07-23 18:57:25", updated_at: "2015-07-23 18:57:25", actionable_items_count: 0, sequence: nil, type: "InsightReportMenuItem">, @messages={}> 
pmpaware-webapp(development)> compliance.delete 

    SQL (111829.8ms) DELETE FROM "actionable_items" WHERE "actionable_items"."type" IN ('InsightReportMenuItem') AND "actionable_items"."id" = 264 
=> #<InsightReportMenuItem id: 264, name: "Compliance", actionable_item_id: nil, created_at: "2015-07-23 18:57:25", updated_at: "2015-07-23 18:57:25", actionable_items_count: 0, sequence: nil, type: "InsightReportMenuItem"> 
+0

Похоже 'грабли БД: migrate' должны были удалены записи. Возможно ли, что у вас много записей с тем же именем. Можете ли вы попытаться запустить 'MenuItem.where (имя:« Настройки проверки »). Delete_all' в консоли и посмотреть, есть ли еще такие записи. – abhishek77in

+0

@ abhishek77in Я знаю правду, странно! Но нет, есть только один случай для каждой записи - подтвержденный через pgAdmin –

ответ

0

НАЙДЕНО РЕШЕНИЕ

class RemoveActionableItems < ActiveRecord::Migration 
    class ActionableItem < ActiveRecord::Base 
    attr_accessible :actionable_item, :name, :sequence, :type 
    end 

    class MenuItemTEMP < ActionableItem 
    self.table_name = "actionable_items" 
    end 

    class InsightReportMenuItemTEMP < ActionableItem 
    self.table_name = "actionable_items" 
    end 

    def up 
    MenuItem.delete_all(name: "Validation Settings") unless MenuItem.find_by_name("Validation Settings").nil? 
    MenuItem.delete_all(name: "Identifier Lookup") unless MenuItem.find_by_name("Identifier Lookup").nil? 
    InsightReportMenuItem.delete_all(name: "Compliance") unless InsightReportMenuItem.find_by_name("Compliance").nil? 
    end 

    def down 
    MenuItem.create :name => "Validation Settings", :type => "MenuItem" 
    MenuItem.create :name => "Identifier Lookup", :type => "MenuItem" 
    InsightReportMenuItem.create :name => "Compliance", :type => "InsightReportMenuItem" 
    end 
end 
Смежные вопросы