Rails和参照完整性

问题描述:

我想知道是否有可能写迁移,而不是下面的原始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可以处理参照完整性,但我希望能够管理它也与后端。 感谢

按照Rails Migrations guide

活动记录的方式声称,情报属于你的模型,而不是在数据库中。因此,诸如触发器或外键约束等将某些智能推回到数据库中的功能并未大量使用。

...

尽管活动记录不直接与这些特性的工作提供任何工具,执行方法可以用来执行任意SQL。你也可以使用一些像foreigner这样的插件,它为Active Record添加了外键支持(包括支持在db/schema.rb中转储外键)。

外国人add_foreign_keyremove_foreign_key也许你要问什么,但我没有任何与它的直接经验。

+0

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

对于任何人被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