我有以下工厂:
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
我的问题是,当我“删除”其中一个商店的商品时,商店仍会显示它有4个商品。
@store.items[0].store_id = nil
@store.save!
puts @store.items.size
看跌期权4.如何正确删除项目?这不是你在铁轨上做的吗?
答案 0 :(得分: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
通过明确传入商店实例,将为您设置关联。这是因为当您在FactoryGirl.create
或FactoryGirl.build
中明确传递某些内容时,它会覆盖工厂定义中定义的内容。它甚至适用于零。这样,您将拥有真实的对象实例,为您提供所有真正的功能。
我认为你的例子中的代码并不好;它打破了商店和商品之间的关联,但实际上并没有删除商品记录,所以你要留下一个孤儿记录。我会这样做:
@store.items[0].destroy
puts @store.items.size
如果尚未销毁父级,则您可能还希望将子级关联设置为销毁。这意味着当您说@store.destroy
时,属于它的所有项目也将被销毁(从数据库中删除)。
class Store < ActiveRecord::Base
has_many :items, dependent: :destroy
.....
end