美文网首页ruby on rails
Rails中不正确的表之间关联关系引起的问题

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

作者: 稻草人_b788 | 来源:发表于2018-03-27 12:02 被阅读6次

一、问题描述

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中不正确的表之间关联关系引起的问题

    一、问题描述 1.在建立mother和kid的model 并且两者之间的关系是: 一个妈妈可以有多个孩子 一个孩子...

  • 《Rails-Guides》Reading notes five

    Rails 支持六种关联 belongs_to关联 belongs_to关联创建两个模型之间一对一的关系,声明所...

  • django知识点四

    模型_02 一、关联关系 1、概述 关联关系指的是数据表之间的数据是相互依赖和影响关系,表之间有从属关系,比如,有...

  • 关联关系查询(第一讲)

    关联查询 当查询内容涉及到具有关联关系的多个表时,就需要使用关联查询。根据表与表之间的关联关系的不同,关联查询分为...

  • Mysql_使用JOIN语句匹配显示多表的关联关系

    sql小白继续学习中…… 问题:存在表A、B、Y三张表,其中表Y为反映表A、B的关联关系表。希望根据关系表Y中的字...

  • Hibernate(3)

    1、表与表之间的关系 一对一 (默认主键关联)首先在实体中描述实体与实体之间的关系,然后在映射文件中描述两个实体...

  • hibernate表与表之间的关系

    1、表与表之间的关系 一对一 (默认主键关联)首先在实体中描述实体与实体之间的关系,然后在映射文件中描述两个实体...

  • MySQL数据库学习day6

    回顾 外键:关联关系(表与表之间:表中字段指向另一张表的主键) 联合查询:union,多表合并和单表不同查询条件 ...

  • Entity Framework - Code Frist

    前言 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的。两个不同表之间可以存在外键依赖关系,一...

  • 关系型数据库与非关系型数据库区别

    关系型数据库通过外键关联来建立表与表之间的关系, 非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的...

网友评论

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

    本文链接:https://www.haomeiwen.com/subject/ntwjcftx.html