2012-02-27 8 views
0

私が知りたいのですがそのような移行をロールバック:Railsと参照整合性は

execute <<-SQL 
    ALTER TABLE records 
    DROP FOREIGN KEY fk_records_categories 
SQL 





rake db:rollback 
== Integrity: reverting ====================================================== 
-- execute("  ALTER TABLE records\n  DROP FOREIGN KEY          fk_records_categories\n") 
rake aborted! 
An error has occurred, all later migrations canceled: 

Mysql2::Error: Error on rename of './BlackshardDev/records' to './BlackshardDev/#sql2-44cc-16c' (errno: 152):  ALTER TABLE records 
    DROP FOREIGN KEY fk_records_categories 

私はActiveRecordのは、参照整合性を扱うことができます知っているが、私は、バックエンドでも、それを管理できるようにしたいと思います。 Rails Migrations guideによると おかげ

答えて

3

のActive Recordの方法は、インテリジェンスがあなたのモデルではなく、データベースに属していることを主張しています。このように、トリガーや外部キー制約など、そのインテリジェンスの一部をデータベースに戻す機能は、あまり使用されません。

...

のActive Recordは、このような機能を直接操作するためのツールを提供していませんが、executeメソッドは、任意のSQLを実行するために使用することができます。 foreignerのようないくつかのプラグインを使用してActive Recordに外部キーサポートを追加することもできます(db/schema.rbの外部キーをダンプするサポートを含む)。

外国人add_foreign_keyremove_foreign_keyおそらくあなたが求めているものを行うが、私はそれと直接経験を持っていません。

+0

おかげで、外国人はちょうど素晴らしいです:) – Dawid

2

ここ解例えばlookigている人にとっては、移行であり、それはロールバック作業です:

def up 
    change_table :records do |t| 
     t.foreign_key :domains, :dependent => :delete 
    end 
    change_table :cryptokeys do |t| 
     t.foreign_key :domains, :dependent => :delete 
    end 
    change_table :domainmetadata do |t| 
     t.foreign_key :domains, :dependent => :delete 
    end 

    end 

    def down 
    change_table :records do |t| 
     t.remove_foreign_key :domains 
    end 
    change_table :cryptokeys do |t| 
     t.remove_foreign_key :domains 
    end 
    change_table :domainmetadata do |t| 
     t.remove_foreign_key :domains 
    end 
    end 
関連する問題