我是Ruby on Rails的新手(虽然我对Ruby非常了解)并且看着Migration工具,听起来真的很棒。数据库模式最终(很容易)进入源代码管理。
现在我的问题了。使用Postgres作为数据库时,它不会设置外键。我想在我的架构中使用外键的好处,例如引用完整性。那么如何在迁移中应用外键?
答案 0 :(得分:13)
Rails哲学是完整性检查是属于模型的业务逻辑。这就是为什么你看到你在数据库中看到的东西; whatever_id只是一个int而不是一个“真正的”fk。它不是一个错误,它的设计和起初有点怪异。通常,驱动人们在数据库级别使用fks的唯一原因是当数据库被多个应用程序或其遗留系统访问时。 这里有很多讨论和一些很棒的链接:Why do Rails migrations define foreign keys in the application but not in the database?
答案 1 :(得分:7)
检查出来:http://github.com/matthuhiggins/foreigner
但首先要确保你确实需要它们(例如,只要你的代码没问题,理论上就不应该破坏参照完整性,你知道:dependent => :destroy
以及user.delete
和user.destroy
之间的区别{{1}})。
答案 2 :(得分:1)
Rails中有许多可用的插件(搜索谷歌),当您在迁移中使用特殊符号时,它会为您创建外键(foreign_key_migrations是Advanced Rails Recipes一书中的一个)。请注意,Rails在使用此概念时效果不佳,尤其是在您尝试删除对象时(如glebm所述)。
答案 3 :(得分: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