2010-04-03 63 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