FactoryGirl:在创建时设置has_many关联

时间:2016-01-08 21:37:18

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 factory-bot

这个问题发生在我从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中执行此操作的正确方法是什么?

1 个答案:

答案 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