2012-11-13 70 views
1

我對軌道很陌生,所以可能會有一個簡單的答案。我試圖添加一個「user_category」列到我的「用戶」表中引用「user_categories」表。我試過如下:Ruby on Rails - 如何在腳手架上創建外鍵

rails generate migration add_user_category_to_users user_category:integer 

然後......

rails generate scaffold User_Category title:string description:text 

但在耙分貝:遷移我收到以下錯誤:

== CreateUserCategories: migrating =========================================== 
-- create_table(:user_categories) 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

SQLite3::SQLException: table "user_categories" already exists: CREATE TABLE "user_categories" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar(255), "description" text, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL) 

任何幫助,將不勝感激。

+1

嗯這不是你應該如何辦......我想你想有2款,1'User'的has_many'Categories'和1'Category' belongs_to的1'User'。我錯了嗎? – MrYoshiji

+0

你有沒有在某個時候爲user_categories創建過遷移?仔細檢查你的db/migrate目錄,看看它是否已經存在。 –

+0

不完全。 1用戶有1個類別,但我不想將類別名稱存儲在數據庫中。這與具有「狀態」表並且引用該標識而不是完整狀態名稱幾十次相似。 – jake

回答

4

Active Record方式聲稱智能屬於您的模型,不屬於數據庫。因此,諸如觸發器或外鍵約束等將某些智能推回到數據庫中的功能並未大量使用。

驗證如驗證:foreign_key,:uniqueness => true是模型可以強制執行數據完整性的一種方式。關聯中的依賴選項允許模型在父銷燬時自動銷燬子對象。與在應用程序級別運行的任何操作一樣,這些操作不能保證參照完整性,因此有些人通過數據庫中的外鍵約束來擴充它們。

雖然Active Record沒有提供任何直接使用這些功能的工具,但execute方法可用於執行任意SQL。你也可以使用一些像外國人一樣的插件,它爲Active Record添加外鍵支持(包括支持在db/schema.rb中轉儲外鍵)。

http://guides.rubyonrails.org/migrations.html

+0

我不確定這是我的意思。我明白邏輯屬於模型,但是如何添加引用另一個表的字段?它甚至不會讓我添加模型,以便我可以在模型中鏈接它們...我錯了嗎? – jake

+0

當你生成這樣的模型時:'rails generate model another_model:references',它將在這個字段的遷移和索引中生成一個'another_model_id'字段,這通常就足夠了。數據庫中不需要外鍵約束。 –

+0

這就是我正在尋找的 - 你有鏈接,我可以閱讀更多關於? – jake

相關問題