10

我有四个模型:UserProduct和。并且有一个,并且属于和属于(多态模型)。OwnershipLocationUserProductLocationLocationUserProduct

我想用来FactoryGirl创建与其所有者具有相同位置的产品。

factory :location do
  sequence(:address) { |n| "#{n}, street, city" }
end

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

我在产品模型文件中创建了一个方法来检索产品的所有者,只需执行product.owner.

我想调整产品工厂,以便将工厂位置替换为product.owner.location. 我怎样才能做到这一点?

编辑 1

我想这样使用它:

首先我创建一个用户

FactoryGirl.create(:user)

后来我创建了一个产品

FactoryGirl.create(:product)

当我把他们两个联系起来时

FactoryGirl.create(:current_ownership, product: product, user: user)

我希望我的产品的位置成为他的所有者之一。

4

2 回答 2

10

使用以下代码。

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

  factory :user_with_product do
    after(:create) do |user|
      create(:product, location: user.location)
    end
  end
end

要创建记录,只需使用user_with_product工厂。

更新:

针对您的问题更新,您可以添加after(:create)回调到ownership工厂

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

  after(:create) do |ownership|
    # update ownership.user.location here with ownership.user.product
  end
end

问题在于您当前的关联设置。由于location属于用户或产品,因此外键在位置。所以一个location不能同时属于一个用户和一个产品。

于 2013-08-26T07:27:03.220 回答
1

使用after_create 回调应该可以解决问题

factory :ownership do
  user # BONUS - as association and factory have the same name, save typing =)
  product
  after(:create) { |ownership| ownership.product.location = ownership.user.location }
end
于 2016-04-01T18:01:25.840 回答