10

UserProductOwnershipおよびの4 つのモデルがありLocationます。Userと をProduct持ちLocation、(ポリモーフィック モデル)と にLocation属します。UserProduct

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 に答える