我有HABTM协会
我的模特
class Ssr < ActiveRecord::Base
has_and_belongs_to_many :ssr_groups
validates :ssr_groups, presence: true
end
class SsrGroup < ActiveRecord::Base
has_and_belongs_to_many :ssrs, dependent: :destroy
validates :name, presence: true
end
我的工厂
FactoryGirl.define do
factory :ssr do
type 'type'
ssr_groups
end
end
FactoryGirl.define do
factory :ssr_group, class: 'SsrGroup', aliases: [:ssr_groups] do
name { SecureRandom.hex }
end
end
我的问题是我想要创建FactoryGirl.create(:ssr)
我有NoMethodError: undefined method each for #<SsrGroup:0x007fbfdf792100>
为什么会这样?
答案 0 :(得分:1)
问题在于,您的ssr
工厂预计会收集ssr_group
,而您正在做的只是一个。这就是错误的原因,因为它试图在创建的ssr_group上做foreach。
要解决此问题,您可以执行以下操作:
FactoryGirl.define do
factory :ssr do
type 'type'
after(:create) do |ssr, evaluator|
create_list(:ssr_group, 1, ssrs: [ssr])
end
end
end
如果愿意,您可以使用build
策略代替create
。
修改强>
你可以改善你的工厂,如下:
FactoryGirl.define do
factory :ssr do
type 'type'
factory :ssr_with_groups do
transient do
groups_count 5 # Default count of ssr_groups it will create
end
after(:create) do |ssr, evaluator|
create_list(:ssr_group, evaluator.groups_count, ssrs: [ssr])
end
end
end
end
这样,它更灵活,您可以像这样使用它:
create(:ssr_with_groups, groups_count: 10)
它会创建一个带有10个ssr_groups的ssr。
编辑2:
鉴于你在关联上有一个状态验证,你需要在保存对象之前添加关联,所以使用构建策略,如下所示:
FactoryGirl.define do
factory :ssr do
type 'type'
after(:build) do |ssr, evaluator|
ssr.ssr_groups << build_list(:ssr_group, 1, ssrs: [ssr])
end
end
end
您可以深入了解文档:http://www.rubydoc.info/gems/factory_girl/file/GETTING_STARTED.md#Associations