You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 6 + FactoryGirl 4.9如何将has_many关联绑定回创建中的父对象

问题原因

Rails 5 之后belongs_to关联默认开启必填校验,你当前的工厂写法存在两个问题触发了报错:

  • 直接在关联属性块内执行create(:contract)时,dp_client实例还未完成持久化,创建Contract时没有传入关联的client参数,触发必填校验
  • 关联属性名写错为大写的Contracts,应该和模型定义的关联名一致,用小写contracts
解决方案

方案1:使用after(:create)回调(推荐)

等父对象Client创建完成后再生成关联的Contract,直接绑定已持久化的父对象:

FactoryGirl.define do
  factory :client do
    name "Test Client"
  end

  factory :dp_client, class: Client do
    after(:create) do |client|
      # 生成1个关联的contract,直接绑定当前创建的client
      create(:contract, client: client)
      # 如果需要生成多个可以用create_list
      # create_list(:contract, 3, client: client)
    end
  end
end

方案2:内联关联属性时传入当前实例

FactoryGirl的属性块内可以通过instance变量访问正在构建的父对象,直接传入Contract的创建参数:

FactoryGirl.define do
  factory :client do
    name "Test Client"
  end

  factory :dp_client, class: Client do
    contracts do
      [create(:contract, client: instance)]
    end
  end
end

两种方案都可以解决绑定问题,如果你的Contract存在依赖Client数据库字段的校验,优先使用after(:create)的方案。


内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:54:04