Rails ActiveRecord关系无效外键错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails ActiveRecord关系无效外键错误相关的知识,希望对你有一定的参考价值。

我是Rails的新手(使用5.1)而我在设置ActiveRecord关联时遇到了麻烦。

组织者可以注册然后创建一个俱乐部。组织者属于一个俱乐部(我想可能有多个俱乐部,但现在可以期待只有一个)。俱乐部可以有很多组织者。

在组织者创建之后将始终创建俱乐部,因此俱乐部上的外键最初为零。

这是我在尝试创建组织者时没有创建任何俱乐部时出现的错误:

ActiveRecord::InvalidForeignKey:         ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR:  insert or update on table "organizers" violates foreign key constraint "fk_rails_bc04936880"
        DETAIL:  Key (club_id)=(0) is not present in table "club".

组织者:

class Organizer < ApplicationRecord
    belongs_to :club, optional: true 
    #also put config.active_record.belongs_to_required_by_default = false in application.rb
end

俱乐部:

class Club < ApplicationRecord
    has_many: organizers
end

架构:

create_table "clubs", force: :cascade do |t|
    t.string "full_name"
    t.string "urn"
    t.string "short_name"
    t.string "address1"
    t.string "address2"
    t.string "city"
    t.string "state"
    t.string "zip"
    t.string "website"
    t.string "phone"
  end

  create_table "organizers", force: :cascade do |t|
    t.string "first_name"
    t.string "last_name"
    t.string "email"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "password_digest"
    t.string "remember_digest"
    t.boolean "superuser", default: false
    t.string "activation_digest"
    t.boolean "activated", default: false
    t.datetime "activated_at"
    t.string "reset_digest"
    t.datetime "reset_sent_at"
    t.bigint "club_id"
    t.index ["club_id"], name: "index_organizers_on_club_id"
    t.index ["email"], name: "index_organizers_on_email", unique: true
  end

  add_foreign_key "organizers", "clubs"

在此先感谢您的帮助!

答案

由于某种原因,您的代码尝试将0值设置为club_id

我建议在此属性中强制使用nil并观察是否仍然出现错误:

Organizer.create!(
  #...
  club_id = nil
)

以上是关于Rails ActiveRecord关系无效外键错误的主要内容,如果未能解决你的问题,请参考以下文章

在复合键和外键之间创建关系

Rails 4 ActiveRecord 有很多通过关系不能从 sql 文件读取

检索ActiveRecord / Rails中没有关系的对象

Rails Activerecord 关系:使用子查询作为 SQL 选择语句的表

Rails在使用多态关联时组合和排序ActiveRecord关系

如何将现有的一对多关系迁移到 Rails 和 ActiveRecord 中的多对多