一、问题描述
1.在建立mother和kid的model
并且两者之间的关系是:
一个妈妈可以有多个孩子
一个孩子只能有一个妈妈
然后构建了如下的关系:
class Mother < ApplicationRecord
has_many :kids
end
class Kid < ApplicationRecord
belongs_to :mother
并建立了kids和mothers的table分别为:
create_table "kids", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "mother_id"
end
create_table "mothers", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
2.然后进入rails console中进行测试:
新建mother的资料,成功存入了数据库
新建kid的资料时,发生了如下的报错
提示Rollback,实际上就是没有存入到数据库中
二、解决方案
导致该情况的原因是虽然在model中建立了mother和kid的关联关系,但是没有在kids的表中建立mother_id这个外键,导致关联关系没有实际建立起来,解决过程如下:
(1)新建迁移文件,在kids的表中加上mother_id
add_column :kids, :mother_id, :integer
(2)运行迁移文件
(3)重进加载console
这时候就可以新建kid资料并成功存入到资料库中了
需要注意的是:
mother的资料一定要存在,否则kid的资料无法创建,如图:
这是因为数据库中并没有mother的id为2的资料,因此无法创建对应的kid;先创建mother的id为2的资料,才可以创建mother_id为2的kid资料
三、结论
不完整表结构会影响model间的关系,进而导致相应的数据无法存入或存入为空
四、补充
我在实作一个项目时,表本身没有问题,但表之间的关联关系没有设置正确的外键,导致其中一个表中的内容一致无法存入,即便存入了也是空的,经过排除发现提示信息为ActiveRecord::RecordInvalid: Validation failed: XXX must exist
,这其实也是表之间的关联关系没有设置好引起的一种结果,后来设置了正确的外键就将这个问题解决了。