Ruby on Rails - 如何在Scaffold中创建外键

3

我还是Rails的新手,所以也许有一个简单的答案。我想在我的“users”表中添加一个“user_category”列,该列引用了一个“user_categories”表。我尝试了以下内容:

rails generate migration add_user_category_to_users user_category:integer

and then...

rails generate scaffold User_Category title:string description:text

但是在运行 rake db:migrate 命令时,我收到了以下错误提示:
==  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
嗯,这不是你应该做的方式...我猜你想要有两个模型,一个User拥有多个Categories,而一个Category属于一个User。我错了吗? - MrYoshiji
你是否曾经为用户类别创建过迁移?请仔细检查你的db/migrate目录,看看它是否已经存在。 - Paul Richter
不完全正确。一个用户有一个类别,但我不想将类别名称存储在数据库中。这类似于拥有一个“州”表并引用ID而不是完整的州名数十次。 - jake
1个回答

5
Active Record认为智能应该存在于模型中,而不是数据库中。因此,如触发器或外键约束等将一些智能推回到数据库的功能并不常用。
验证,例如validates:foreign_key,:uniqueness => true是模型强制执行数据完整性的一种方式。关联上的:dependent选项允许模型在父对象被销毁时自动销毁子对象。像任何在应用程序级别操作的东西一样,这些无法保证引用完整性,因此有些人会在数据库中增加外键约束来补充它们。
虽然Active Record没有提供任何直接使用此类功能的工具,但可以使用execute方法来执行任意SQL。您还可以使用一些插件,例如Foreigner,它可以向Active Record添加外键支持(包括支持在db/schema.rb中转储外键)。

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


我不确定这是我的意思。我理解逻辑应该属于模型,但是如何添加一个引用另一个表的字段呢?它甚至不让我添加模型,以便我可以在模型内部链接它们... 我有错吗? - jake
当您像这样生成模型:rails generate model another_model:references时,它将在迁移中生成一个another_model_id字段和此字段的索引,通常足够了。您的数据库不需要外键约束。 - Dan K.K.
这正是我正在寻找的 - 你有一个链接可以让我了解更多吗? - jake
1
请跟随我回答中添加的链接,以及这个链接:http://guides.rubyonrails.org/association_basics.html,这应该足以理解整个内容 :) - Dan K.K.
在我的情况下,它会像这样 rails generate model user_category user:user_category 吗? - jake
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接