2012-11-13 49 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

相关问题