2013-02-05 51 views
3

這很可能是一個小菜一碟的問題,因爲人們使用這個寶石,很多人喜歡它,但我沒有達到目的。我正在尋找一個項目,並在t.references :foreign_key_table_name , :foreign_key => true,add_foreign_key :table :foreign_key_table_name, :options和創建t.foreign_key :foreign_key_table_name等地方多次使用過。希望這些人不會因爲他們的背景不清楚而感到困惑。爲什麼有人會使用寶石外國人?

但我不明白這是從什麼軌道與內置t.references :foreign_key_table_name或從我剛剛添加t.integer :foreign_key_table_name_id不同?它是否通過明確說明這是一個「外鍵」而使其更具可讀性?如果是這種情況,我可以添加評論而不是寶石...我看到的唯一優勢是,您可以將諸如:dependent之類的選項移動到遷移中,而不是在模型中使用,但是誰關心?

回答

10

一些數據庫引擎支持合法的外鍵約束:如果有人試圖保存Child爲5的parent_id,但沒有Parentid 5,則數據庫本身(不是Rails的)將拒絕記錄,如果有外國鍵連接children.parent_idparents.id

一個外鍵還可以指定如果父項被刪除會發生什麼情況:在MySQL中,例如,我們可以刪除或取消依賴記錄,比如Rails如何處理:dependent,甚至是直接拒絕刪除,改爲拋出錯誤。由於並非所有的數據庫引擎都提供這種功能,因此Rails提供了使用:dependent來模擬它,並且在軟件級別上使用它很好,因此,在刪除父項時,相關子記錄可以觸發其destroy回調。由於該功能與引擎無關,因此幾乎與模式無關,Rails不處理創建/刪除外鍵。這就是foreigner的地方:如果您的引擎支持外鍵約束,並且您希望對數據完整性有更多的信心,foreigner可以提供幫助。

+1

感謝時默認上something_id增加了一個指標,是有道理的,爲什麼他不能只是說,在創業板上市的描述哈哈... – GiH

+1

@GiH:哦,它剛剛發生,我爲什麼':dependent'不這樣做:因爲這是一個模型級別的規範,可以隨時添加/刪除。它的構建靈活,而不是要求外鍵也存在於數據庫中 - 這太奇怪了,因爲並不是所有支持Rails的數據庫引擎都支持外鍵。 – Matchu

6

這裏復活一個老問題,但...

有軌強制的關係是好的,導軌本身。

但是,如果您的項目增長爲具有也可從其他語言訪問這些表的代碼,那麼這將不具有強制執行關係的rails的好處。這些外鍵約束被烘焙到SQL表中,因此可以保護非rails代碼。

如果您需要執行數據修復或通過本地SQL處理數據,這也可以保護您。

0

另一個原因是某些用於SQL的文檔工具查看數據庫上的外鍵,因此使用生成它們的gem很酷。軌道4加入與創建表相同的遷移定義外鍵的能力:

t.references :something, foreign_key: true 

如果你使用references型發電機會爲你做這個。 Rails的使用foreign_key這樣

相關問題