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 选择语句的表