0

私は次の工場を持っています:

factory :store do
  room
  factory :store_with_items do
    ignore do
      items_count 4
    end

    after(:create) do |store, evaluator|
      FactoryGirl.create_list(:equippable_item, evaluator.items_count, store: store)
    end
  end
end

次に、オブジェクトを作成します。

@store = FactoryGirl.create :store_with_items

私の問題は、ストアのアイテムの1つを「削除」しても、ストアに4つのアイテムがあることを示していることです。

@store.items[0].store_id = nil
@store.save!
puts @store.items.size

プットは4です。アイテムを適切に削除するにはどうすればよいですか?これはあなたがレールでそれをする方法ではありませんか?

4

1 に答える 1

0

以前はこのアプローチを好んでいましたが、今は避けています。ファクトリをシンプルにし、実行時に has_many 関連付けを設定する方が簡単で柔軟です。

これを試して

ストアの工場 (同じ):

factory :store do
  room
end

アイテムの工場:

factory :item do
  store # will use the store factory
end

次に、私のテストでは、当面のケースに適したものを入力します。

@store = FactoryGirl.create :store
@item1 = FactoryGirl.create :item, store: @store
@item2 = FactoryGirl.create :equippable_item_or_whatever_factory_i_use, store: @store

説明する

store インスタンスを明示的に渡すことで、関連付けが設定されます。これは、何かを明示的に渡すかFactoryGirl.createFactoryGirl.buildファクトリ定義で定義されているものをオーバーライドするためです。nilでも動作します。このようにして、すべての実際の機能を提供する実際のオブジェクト インスタンスが得られます。

テスト破壊するには

あなたの例のコードは良くないと思います。ストアとアイテムの関連付けは解除されますが、アイテム レコードは実際には削除されないため、孤立したレコードが残ります。代わりにこれを行います:

@store.items[0].destroy
puts @store.items.size

ボーナス

親がまだ破棄されていない場合は、親が破棄されたときに子の関連付けを破棄するように設定することもできます。@store.destroyこれは、それに属するすべてのアイテムも破棄される (データベースから削除される) と言う場合を意味します。

class Store < ActiveRecord::Base
  has_many :items, dependent: :destroy
  .....
end
于 2013-02-08T08:03:48.037 に答える