我是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