【问题标题】:Rails5 - Adding Foreign Keys to Existing Models in postgresRails5 - 在 postgres 中为现有模型添加外键
【发布时间】:2016-08-08 14:27:23
【问题描述】:

我有两个模型。一个Events 模型和一个EventOptionEventshave_many :event_options

我的问题是,当我尝试迁移到 add_foreign key :event_options, :events 以便将它们链接起来时,我收到以下错误:

ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:  column "event_id" referenced in foreign key constraint does not exist
: ALTER TABLE "event_options" ADD CONSTRAINT "fk_rails_3995702fad"
FOREIGN KEY ("event_id")
  REFERENCES "events" ("id")

这是我的 schema.rb:

ActiveRecord::Schema.define(version: 20160806001743) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "event_options", force: :cascade do |t|
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.float    "price"
    t.text     "description"
    t.string   "name"
  end

  create_table "events", force: :cascade do |t|
    t.datetime "created_at",                null: false
    t.datetime "updated_at",                null: false
    t.string   "name"
    t.boolean  "active",     default: true
  end

  create_table "users", force: :cascade do |t|
    t.datetime "created_at",                     null: false
    t.datetime "updated_at",                     null: false
    t.string   "email",                          null: false
    t.string   "encrypted_password", limit: 128, null: false
    t.string   "confirmation_token", limit: 128
    t.string   "remember_token",     limit: 128, null: false
    t.index ["email"], name: "index_users_on_email", using: :btree
    t.index ["remember_token"], name: "index_users_on_remember_token", using: :btree
  end

end

我知道有 :id 列有效,因为我可以在控制台中使用它们。我知道我在这里遗漏了一些东西来让外键为应用程序工作,但对于我的生活,我不知道是什么。

【问题讨论】:

  • 它需要event_id 你需要在你的event_options 表上,否则has_many 也不起作用

标签: ruby-on-rails ruby postgresql ruby-on-rails-5


【解决方案1】:

等等,你的意思是 has_many 的外键选项,这不是 add_foreign_key 混淆的东西。它添加了一个外键约束。

因此,在您的迁移中,您需要先执行add_columnadd_reference

add_reference :event_options, :event, index: true 
add_foreign_key :event_options, :events

【讨论】:

  • 做到了!并且只是为了确保我理解它是如何工作的(我以为我在此之前做过,但现在谁知道呢?),我可以将 :events 的 :id 列中的任何内容添加到 :event_options 的 :event_id 中,以及那些会链接的,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
相关资源
最近更新 更多