我是Ruby on Rails的新手(虽然我知道Ruby虽然体面),但看着迁移工具,这听起来真棒。数据库模式可以最终(轻松地)进入源代码控制。Rails的ActiveRecord :: Migration的外键?
现在我的问题。当使用Postgres作为数据库时,它不会设置外键。我希望我的模式中的外键的好处,例如参照完整性。那么如何使用Migrations应用外键?
我是Ruby on Rails的新手(虽然我知道Ruby虽然体面),但看着迁移工具,这听起来真棒。数据库模式可以最终(轻松地)进入源代码控制。Rails的ActiveRecord :: Migration的外键?
现在我的问题。当使用Postgres作为数据库时,它不会设置外键。我希望我的模式中的外键的好处,例如参照完整性。那么如何使用Migrations应用外键?
Rails哲学是完整性检查是属于模型的业务逻辑。这就是为什么你看到你在数据库中看到的东西; whatever_id只是一个整数,并不是一个“真正的”fk。这不是一个错误,它的设计和起初有点怪异。通常,驱动人们在数据库级别使用fks的唯一原因是数据库被多个应用程序或其旧系统访问时。 有大量的讨论和一些伟大的链接在这里:Why do Rails migrations define foreign keys in the application but not in the database?
检查了这一点:http://github.com/matthuhiggins/foreigner
但首先要确保你确实需要它们(如引用完整性的东西,理论上不应该,只要你的代码是OK分手,你知道:dependent => :destroy
之间的差异user.delete
和user.destroy
)。
有许多为当您在迁移使用一个特殊的符号,它会为你创建外键的Rails可用(搜索谷歌)的插件(foreign_key_migrations是一个从高级Rails食谱书)。请注意Rails在这个概念上玩的不好,特别是当你试图删除对象时(正如glebm所提到的那样)。
我刚刚遇到这个帖子。也许有人会觉得它有用。那怎么约束创建:
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
那么,我的目标是一个新的项目,没有其他应用程序将访问它..所以也许我不需要它?这感觉很奇怪,虽然大声笑 – Earlz 2010-04-03 23:19:14
它确实感到奇怪。最终你会看到它的感觉。为了解决下面的速度问题,您应该在迁移中使用add_index命令。 fk自动向数据库添加一个索引。在Rails中,您只需根据需要添加它们...如果您还记得:) – mikewilliamson 2010-04-03 23:22:24
FYI fk =外键,int =完整性 – Ameen 2013-10-09 08:19:49