改善相关模型的工厂

时间:2013-08-26 08:28:52

标签: ruby-on-rails factory-bot model-associations

我有三种模式:用户,产品和所有权。所有权属于用户和产品。产品和用户拥有许多所有权。

我使用FactoryGirl gem创建了以下工厂:

factory :user do
  sequence(:name)  { |n| "Robot #{n}" }
  sequence(:email) { |n| "numero#{n}@robots.com"}
  association :location, factory: :location
end

factory :product do
  sequence(:name) { |n| "Objet #{n}" }
  association :location, factory: :location
end

factory :ownership do
  association :user, factory: :user
  association :product, factory: :product
end

我这样使用它:

let(:user) { FactoryGirl.create(:user) }
let(:product) { FactoryGirl.create(:product) }
let(:ownership) { FactoryGirl.create(:current_ownership, user: user, product: product) }

但我想改善我的工厂,为了做到这一点:

let(:user) { FactoryGirl.create(:user) }
let(:product) { FactoryGirl.create(:product, owner: user) }

你知道怎么做吗?

1 个答案:

答案 0 :(得分:0)

你可以使用工厂女孩after_create回调:

FactoryGirl.define do
  factory :product do
    # ...

    ignore do
      owner nil
    end

    after :create do |product, ev|
      if ev.owner
        create :ownership, user: ev.owner, product: product
      end
    end
  end
end

这样就可以配置工厂了,你可以将所有者属性传递给它。 ignore块确保此属性不会传递给对象的构造函数,但您可以在工厂女孩的回调中使用它。

您可以找到有关工厂女孩回调here的更多信息。