Rails factory_girls 和验证问题
Rails factory_girls and validation issue
我有 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>
为什么会这样?
你的问题是你的 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
我有 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>
为什么会这样?
你的问题是你的 ssr
工厂期待收集 ssr_group
,而你正在做的只是得到一个。这就是错误的原因,因为它试图在创建的 ssr_group.
要解决此问题,您可以这样做:
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