请求编写关联两个模型的Rails Timeline模型的FactoryGirl代码
没问题,我来帮你搞定这个FactoryGirl(现在一般叫FactoryBot啦,写法基本一致)的代码!先理清楚你的模型逻辑:Creator和Series通过contents表做了多对多关联,Timeline同时属于Creator和Series,而且还有个自定义验证确保关联的Series必须属于该Creator对吧?
下面是分模块的工厂代码,保证创建Timeline时能通过你的验证:
1. Creator 工厂
先写Creator的基础工厂,方便后续关联使用:
# spec/factories/creators.rb FactoryBot.define do factory :creator do # 这里替换成你Creator模型实际需要的属性,比如name、email之类的 name { "Jane Doe" } # 可选:加个trait,方便直接创建带关联Series的Creator trait :with_series do after(:create) do |creator| create(:series, creators: [creator]) end end end end
2. Series 工厂
Series需要和Creator关联,所以我们在工厂里默认帮它关联一个Creator,或者允许传入已有的Creator:
# spec/factories/series.rb FactoryBot.define do factory :series do # 替换成你Series的实际属性,比如title、description title { "My Awesome Series" } # 构建Series时自动关联一个Creator,避免孤立的Series after(:build) do |series| series.creators << build(:creator) unless series.creators.any? end end end
3. Timeline 核心工厂
重点来了!这里要确保Timeline的Series和Creator是已经关联好的,才能通过你的series_belongs_to_creator验证:
# spec/factories/timelines.rb FactoryBot.define do factory :timeline do # 先关联Creator,再关联Series association :creator association :series # 关键步骤:确保关联的Series属于这个Creator after(:build) do |timeline| unless timeline.series.creators.include?(timeline.creator) timeline.series.creators << timeline.creator end end # 可选:如果你需要用已有的、提前关联好的Creator和Series,可以用这个trait trait :with_existing_pair do creator { create(:creator) } series { create(:series, creators: [creator]) } end end end
小提示
- 如果你还在使用旧版的FactoryGirl,只需要把代码里的
FactoryBot换成FactoryGirl就行。 - 记得根据你的实际模型属性,补充Creator和Series里的字段(比如name、title这些),不然创建出来的对象可能缺少必要属性。
- 用这个工厂创建Timeline时,不管是
create(:timeline)还是用trait传入已有的关联对,都能通过你的自定义验证,因为我们确保了Series和Creator是绑定的。
内容的提问来源于stack exchange,提问作者Thịnh
相关产品推荐
相关产品推荐

