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
相关产品推荐
相关产品推荐

