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可以处理参照完整性,但我希望能够管理它也与后端。 感谢
答
活动记录的方式声称,情报属于你的模型,而不是在数据库中。因此,诸如触发器或外键约束等将某些智能推回到数据库中的功能并未大量使用。
...
尽管活动记录不直接与这些特性的工作提供任何工具,执行方法可以用来执行任意SQL。你也可以使用一些像foreigner这样的插件,它为Active Record添加了外键支持(包括支持在db/schema.rb中转储外键)。
外国人add_foreign_key
和remove_foreign_key
也许你要问什么,但我没有任何与它的直接经验。
答
对于任何人被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
感谢,老外好了:) – Dawid 2012-02-27 21:14:41