2010-04-03 64 views
14

我是Ruby on Rails的新手(虽然我知道Ruby虽然体面),但看着迁移工具,这听起来真棒。数据库模式可以最终(轻松地)进入源代码控制。Rails的ActiveRecord :: Migration的外键?

现在我的问题。当使用Postgres作为数据库时,它不会设置外键。我希望我的模式中的外键的好处,例如参照完整性。那么如何使用Migrations应用外键?

回答

12

Rails哲学是完整性检查是属于模型的业务逻辑。这就是为什么你看到你在数据库中看到的东西; whatever_id只是一个整数,并不是一个“真正的”fk。这不是一个错误,它的设计和起初有点怪异。通常,驱动人们在数据库级别使用fks的唯一原因是数据库被多个应用程序或其旧系统访问时。 有大量的讨论和一些伟大的链接在这里:Why do Rails migrations define foreign keys in the application but not in the database?

+0

那么,我的目标是一个新的项目,没有其他应用程序将访问它..所以也许我不需要它?这感觉很奇怪,虽然大声笑 – Earlz 2010-04-03 23:19:14

+1

它确实感到奇怪。最终你会看到它的感觉。为了解决下面的速度问题,您应该在迁移中使用add_index命令。 fk自动向数据库添加一个索引。在Rails中,您只需根据需要添加它们...如果您还记得:) – mikewilliamson 2010-04-03 23:22:24

+0

FYI fk =外键,int =完整性 – Ameen 2013-10-09 08:19:49

7

检查了这一点:http://github.com/matthuhiggins/foreigner

但首先要确保你确实需要它们(如引用完整性的东西,理论上不应该,只要你的代码是OK分手,你知道:dependent => :destroy之间的差异user.deleteuser.destroy)。

+0

嗯,我想不仅是参照完整性,而且外键的速度好处,只要你加入2个key'd表。 – Earlz 2010-04-03 23:13:02

+1

@Earlz,我知道这是在rails社区中的一大堆蠕虫,但是如果你使用的是mysql,那看起来似乎是一件容易的事情。这个插件工作得非常好。 'FK in Rails == HAPPY' :) – 2010-04-04 07:11:57

+2

顺便说一句,Rails站在fks上并不影响连接的速度,你仍然可以在任何字段上定义索引。 – sahglie 2010-11-03 22:17:03

1

有许多为当您在迁移使用一个特殊的符号,它会为你创建外键的Rails可用(搜索谷歌)的插件(foreign_key_migrations是一个从高级Rails食谱书)。请注意Rails在这个概念上玩的不好,特别是当你试图删除对象时(正如glebm所提到的那样)。

0

我刚刚遇到这个帖子。也许有人会觉得它有用。那怎么约束创建:

http://guides.rubyonrails.org/migrations.html#using-reversible

class ExampleMigration < ActiveRecord::Migration 
def change 
create_table :products do |t| 
    t.references :category 
end 

reversible do |dir| 
    dir.up do 
    #add a foreign key 
    execute <<-SQL 
     ALTER TABLE products 
     ADD CONSTRAINT fk_products_categories 
     FOREIGN KEY (category_id) 
     REFERENCES categories(id) 
    SQL 
    end 
    dir.down do 
    execute <<-SQL 
     ALTER TABLE products 
     DROP FOREIGN KEY fk_products_categories 
    SQL 
    end 
end 

add_column :users, :home_page_url, :string 
rename_column :users, :email, :email_address 
end