一点背景知识:
每个产品都有一组变体,产品的变体数量应根据其属性而变化。
一个名为find_valid_variants的方法返回产品应具有的变体,然后将其传递给destroy_redundant_variants方法,该方法应该销毁该产品具有但不包含在valid_variants中的任何变体。
def self.find_valid_variants(product)
product.product_options.blank? ? options = [nil] : options = product.product_options
product.product_sides.blank? ? sides = [nil] : sides = product.product_sides
product.product_sizes.blank? ? sizes = [nil] : sizes = product.product_sizes
valid_variants = []
sides.product(sizes, options).each do |side, size, option|
valid_variants << Variant.where(product_id: product.id, product_side_id: side, product_size_id: size, product_option_id: option)
end
valid_variants
end
def self.find_redundant_variants(product)
destroy_redundant_variants(product, find_valid_variants(product))
end
def self.destroy_redundant_variants(product, valid_variants)
(product.variants - valid_variants).each { |valid_variant| valid_variant.destroy }
end
问题是,在我的测试用例中,该方法会破坏所有产品变体,它只能破坏2。
这是Rspec测试:
it "destroys the redundant variants" do
@product = Fabricate(:product, product_size_ids: ["#{@product_size.id}", "#{@product_size_2.id}"], product_options_attributes: [{name: 'Rounded', description: 'Add a round edge'}, {name: 'None', description: 'Nothing'}])
@product.variants.count.should == 4
@product.product_options.each { |p| p.destroy }
@product.reload
ProductVariationService.find_redundant_variants(@product)
@product.variants.count.should == 2
end