使用Rails的ActiveRecord :: Migration的外键?

时间:2010-04-03 22:54:47

标签: ruby-on-rails postgresql foreign-keys migration

我是Ruby on Rails的新手(虽然我对Ruby非常了解)并且看着Migration工具,听起来真的很棒。数据库模式最终(很容易)进入源代码管理。

现在我的问题了。使用Postgres作为数据库时,它不会设置外键。我想在我的架构中使用外键的好处,例如引用完整性。那么如何在迁移中应用外键?

4 个答案:

答案 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.deleteuser.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