2012-02-27 119 views
0

我想知道是否有可能寫遷移,而不是下面的原始SQL語句:Rails和參照完整性

execute <<-SQL 
    ALTER TABLE records 
    ADD CONSTRAINT fk_records_domains 
    FOREIGN KEY (domain_id) 
    REFERENCES domains(id) ON DELETE CASCADE 
SQL 

我將使用SQL,因爲我想要的時候得到的問題,如避免回滾這種遷移:

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可以處理參照完整性,但我希望能夠管理它也與後端。 感謝

回答

3

按照Rails Migrations guide

活動記錄的方式聲稱,情報屬於你的模型,而不是在數據庫中。因此,諸如觸發器或外鍵約束等將某些智能推回到數據庫中的功能並未大量使用。

...

儘管活動記錄不直接與這些特性的工作提供任何工具,執行方法可以用來執行任意SQL。你也可以使用一些像foreigner這樣的插件,它爲Active Record添加了外鍵支持(包括支持在db/schema.rb中轉儲外鍵)。

外國人add_foreign_keyremove_foreign_key也許你要問什麼,但我沒有任何與它的直接經驗。

+0

感謝,老外好了:) – Dawid 2012-02-27 21:14:41

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