这个问题发生在我从Rails 3.2到Rails 4.2的升级中。这可能与Rails 4破坏的许多事情有关。
我有以下工厂:
factory :account do
sequence(:email) {|n| "email#{n}@example.org" }
sequence(:name) {|n| "Name #{n}" }
end
此模型有一个名为ips的has_many关联。在特定测试中,我需要使用ip设置帐户。在Rails 3.2中,我能够做到这一点:
FactoryGirl.create(:account, :ips => [FactoryGirl.create(:ip)])
但在Rails 4中我得到一个例外:
ActiveRecord::RecordInvalid: Validation failed: Ips is invalid
我能够验证我不能再覆盖has_many关联。例如:
account = FactoryGirl.build(:account)
account.ips = [FactoryGirl.create(:ip)]
account.save!
它也会抛出异常。
作为旁注,使用<<工作正常,但这不是我想要的,因为我想要删除分配给该帐户的任何IP,只设置新的。
在Rails 4中执行此操作的正确方法是什么?
答案 0 :(得分:2)
为此,我建议使用具有后创建的特征。所以它看起来像这样:
FactoryGirl.define do
factory :account do
sequence(:email) {|n| "email#{n}@example.org" }
sequence(:name) {|n| "Name #{n}" }
end
trait :with_ip do
transient do
ip_count 5
end
after(:create) do |account, evaluator|
create_list(:ip, evaluator.ip_count, account: account)
end
end
end
请参阅此内容以获取进一步参考:https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md