【问题标题】:Ruby on Rails - How to Create Foreign Key in ScaffoldRuby on Rails - 如何在 Scaffold 中创建外键
【发布时间】:2012-11-13 22:18:32
【问题描述】:

我对 Rails 很陌生,所以可能有一个简单的答案。我正在尝试将“user_category”列添加到我的“users”表中,该表引用“user_categories”表。我尝试了以下方法:

rails generate migration add_user_category_to_users user_category:integer

然后……

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) 

任何帮助将不胜感激。

【问题讨论】:

  • 嗯,这不是你应该做的......我想你想要 2 个模型,1 个 User has_many Categories 和 1 个 Category belongs_to 1 User。我错了吗?
  • 您是否在某个时候已经为 user_categories 创建了迁移?仔细检查您的 db/migrate 目录,看看它是否已经存在。
  • 不完全。 1 个用户有 1 个类别,但我不想将类别名称存储在数据库中。这类似于拥有一个“状态”表并多次引用 id 而不是完整的状态名称。

标签: ruby-on-rails database activerecord


【解决方案1】:

Active Record 方式声称智能属于您的模型,而不是数据库。因此,触发器或外键约束等将部分情报推回数据库的功能并未得到大量使用。

validates :foreign_key, :uniqueness => true 等验证是模型强制数据完整性的一种方式。关联上的 :dependent 选项允许模型在父对象被销毁时自动销毁子对象。就像在应用程序级别运行的任何东西一样,它们不能保证引用完整性,因此有些人在数据库中使用外键约束来扩充它们。

虽然 Active Record 没有提供任何工具来直接使用这些特性,但是 execute 方法可以用来执行任意 SQL。你也可以使用一些插件,比如 foreigner,为 Active Record 添加外键支持(包括支持在 db/schema.rb 中转储外键)。

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

【讨论】:

  • 我不确定这就是我的意思。我知道逻辑属于模型,但是如何添加引用另一个表的字段?它甚至不允许我添加模型,所以我可以在模型中链接它们......我不正确吗?
  • 当你生成这样的模型时:rails generate model another_model:references,它会在迁移和索引中生成一个another_model_id字段,这通常就足够了。您的数据库中不需要外键约束。
  • 这正是我要找的——你有链接让我可以阅读更多相关信息吗?
  • 点击我在答案中添加的链接,这也是:guides.rubyonrails.org/association_basics.html,应该足以理解整个事情:)
  • 在我的情况下它看起来像rails generate model user_category user:user_category吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多