Rails中不正确的表之间关联关系引起的问题

一、问题描述

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,这其实也是表之间的关联关系没有设置好引起的一种结果,后来设置了正确的外键就将这个问题解决了。

你可能感兴趣的:(Rails中不正确的表之间关联关系引起的问题)