工厂构建/创建新的belongs_to时违反Mysql外键约束

Posted

技术标签:

【中文标题】工厂构建/创建新的belongs_to时违反Mysql外键约束【英文标题】:Mysql foreign key constraint violation when factory builds/creates a new belongs_to 【发布时间】:2018-03-08 15:51:28 【问题描述】:

我有两个模型:

class Language < ActiveRecord::Base
  self.primary_key = 'language_id'

  has_many :results_footers
end

class ResultsFooter < ActiveRecord::Base
  belongs_to :language
end

工厂:

# spec/factories/languages.rb
FactoryBot.define do
  factory :language do
    sequence(:language_id)
  end
end

测试:

# spec/models/results_footer.rb
require 'rails_helper'

RSpec.describe ResultsFooter, :type => :model do
  it 'has a valid factory' do
    create(:results_footer).should be_valid
  end
 end

results_footer 表是一个 mysql 表,其 language_id 字段具有 fk 约束。

当我运行测试时,我得到:

ActiveRecord::InvalidForeignKey: Mysql2::Error: 无法添加或更新子行:外键约束失败 (thing_dev.results_footers, CONSTRAINT results_footers_ibfk_2 FOREIGN KEY (language_id) REFERENCES language (language_id) ON UPDATE CASCADE ): INSERT INTO results_footers (language_id, grade, content, exam_type_id) VALUES (1, 'D', 'Hello World', 104)

当然,如果我删除约束,它会起作用。但删除约束不是一种选择。

奇怪的是,我还有许多其他具有类似 fk 约束的表,并且它们的关联有效。

我的协会有什么问题?

谢谢

【问题讨论】:

【参考方案1】:

没关系,我要的答案在这里:

https://gist.github.com/myronmarston/61380bb4500b4d85dd3f

【讨论】:

以上是关于工厂构建/创建新的belongs_to时违反Mysql外键约束的主要内容,如果未能解决你的问题,请参考以下文章

简单工厂模式使用ResourceBundle读取.properties配置文件

简单工厂模式

简单工厂模式

设计模式-创建模式

在laravel 5.2中使用工厂关系违反完整性约束

设计模式:工厂方法模式