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

FactoryBot创建tracker与多态trackable共享同一用户的实现问题

问题原因
  • 现有工厂代码存在语法错误:FactoryBot 定义特征使用单数关键字trait,使用复数traits会导致特征不生效
  • 原有after(:build)回调属于后置赋值,在关联对象(Dog/Cat/Horse)的user为必填时,创建trackable对象阶段就会因缺少user触发验证失败;如果Tracker存在user与trackable.user一致性的校验,也会在回调执行前就报错
  • 直接用association :trackable, factory: :dog的写法会自动为trackable生成独立的新user,不仅和tracker的user不一致,还会产生多余的测试数据
解决方案

直接修改trait定义,在创建trackable关联时主动传入当前tracker的user,不需要额外回调:

factory :tracker do
  user

  trait :dog do
    trackable { association :dog, user: user }
  end

  trait :cat do
    trackable { association :cat, user: user }
  end

  trait :horse do
    trackable { association :horse, user: user }
  end
end
效果验证

可直接按原有方式调用工厂,生成的tracker和对应trackable会自动绑定同一个用户:

# 不传自定义user时,自动生成同一个用户绑定两个对象
tracker = create(:tracker, :dog)
tracker.user == tracker.trackable.user # => true

# 也支持传入自定义用户
my_user = create(:user)
tracker = create(:tracker, :dog, user: my_user)
tracker.user == my_user # => true
tracker.trackable.user == my_user # => true

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:48:01