2010-03-03 53 views
4

Rails沒有辦法在遷移中創建外鍵(不過,有插件可以這樣做)。例如,還有很多級聯選項,因此可以進行級聯刪除。通常避免使用Rails中的外鍵?

內置所有這些選項,值得在數據庫中創建外鍵嗎? Rails開發人員通常會避免這種情況嗎?你會想,如果這是Rails本能地支持它的推薦做法。

回答

4

這是一個神聖的問題,因爲DHH(Rails的創建者)之前已經說過,他認爲數據庫本質上是一個巨大的哈希表,所以利用數據庫引擎擅長的一些事情使用諸如約束或存儲過程之類的特性不被Rails認爲是Rails方式。這就是說,如果你想強制數據的最接近數據的完整性,或者如果你的數據庫被其他應用程序共享,那麼一定要用這些插件之一來創建外鍵。畢竟,它有什麼危害,對吧?

+0

聽起來軌道將是良好的數據庫使用的垮臺:p – ryeguy 2010-03-03 17:22:34

+0

@ryeguy互聯網是數據庫良好使用的倒臺。在NoSQL上閱讀:p – meagar 2010-03-03 17:26:29

4

Rails不會阻止您在數據庫中使用外鍵約束,它只是在默認情況下不會給你。 「Rails方式」是依靠Rails來管理你的數據庫,級聯你的刪除,執行參照完整性等。

有幾個插件可以將外鍵約束添加到你的遷移,但我通常選擇手動添加它們。假設你已經創建調用createUsers和CreatePosts遷移,你可以添加一個「LinkPostsToUsers」遷移:

# Assumes PostgreSQL 
class LinkPostsToUsers < ActiveRecord::Migration 
    def self.up 
    execute " 
     ALTER TABLE posts 
     ADD CONSTRAINT fk_posts_user_id 
     FOREIGN KEY (user_id) REFERENCES users(id) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE" 
    end 

    def self.down 
    execute "ALTER TABLE posts DROP CONSTRAINT fk_posts_user_id" 
    end 
end 
+0

拼寫錯誤「REFERENCES」字樣。 – Dmitry 2010-04-25 16:01:06

7

只是增加了約翰·託普利的答案,我做了一些研究,發現一些DHH的思想的主題,爲一個有趣的閱讀:

我找不到DHH參照數據庫作爲一個「巨人哈希」,所以也許約翰轉述一個不同的報價。我很想閱讀DHH意見的更新版本。

我從過去幾年寫的其他人沒有發現太多意見。下面是我發現的: