将 csv 文件导入到使用 spree 的应用程序时如何删除数据库中的重复项 gem

how to remove duplicacy in database when importing csv file into app that using spree gem

我正在我的应用程序中使用 spree gem。我使用 csv file.Three table 从 product_controller_decorator.rb 导入产品,例如 spree_products、spree_variants 和 spree_prices 是关系。当@prod.save 发生时,它会在 spree_products 中创建一行,在 spree_variants 中创建一行,在 spree_prices 中创建一行。然后另一个 spree_variants 和 spree_prices 行形式由于对应的@prod 的 @var 和 @price 而在 table.This 中创建重复是由于 三个tables.can之间的关联任何一个解决这个complicacy.It意味着它形成一行到每个table。

def import

    require 'csv'
    file = params[:file]
    CSV.foreach(file.path, headers: true, encoding:'iso-8859-1:utf-8') do |row|

   @prod = Spree::Product.new()
   @prod.name = row["name"]
   @prod.shipping_category_id = row["shipping_category_id"]
   @prod.description = row["description"]
   @prod.available_on = row["available_on"]
   @prod.meta_description = row["meta_description"]
   @prod.meta_keywords = row["meta_keywords"]
   @prod.tax_category_id = row["tax_category_id"]
   @prod.shipping_category_id = row["shipping_category_id"]
   @prod.promotionable = row["promotionable"]
   @prod.meta_title = row["meta_title"]
   @prod.featured = row["featured"]
   @prod.supplier_id = row["supplier_id"]
   @prod.master.price = row["master_price"]
   @prod.save!

   @var = Spree::Variant.create(cost_price: row["cost_price"], is_master:1, product_id: @prod.id, sku: row["sku"])
   if @var.errors.present?
           render json: @var   #.errors and return
   end

   @price = Spree::Price.create(variant_id: @var.id)
   if @price.errors.present?
           render json: @price #.errors and return
   end

end
   redirect_to admin_products_path, notice: "products imported."
end

使用 Spree,在保存产品时创建母版,并应用母版的默认值。 @var = Spree::Variant.create,而不是创建新的主变体,而是更新主变体。您通过分配 @prod.master.price = row["master_price"] 在文件的前面更新母版。该代码没有失败,因为 master 是在调用 @product.save 之前使用默认值创建的。 @price = Spree::Price.create(variant_id: @var.id) 行将空(默认)价格与@prod.master 相关联。这已经完成了,它们应该是独一无二的,所以这样做可能会产生影响。

执行后避免检查错误.create。如果要验证错误,请在保存之前执行此操作。方法是:

@var = Spree::Variant.new(cost_price: row["cost_price"], is_master:1, product_id: @prod.id, sku: row["sku"])
if @var.errors.present?
       render json: @var   #.errors and return
else @var.save

我会重写这个块:

 @prod = Spree::Product.new()
 @prod.name = row["name"]
 @prod.shipping_category_id = row["shipping_category_id"]
 @prod.description = row["description"]
 @prod.available_on = row["available_on"]
 @prod.meta_description = row["meta_description"]
 @prod.meta_keywords = row["meta_keywords"]
 @prod.tax_category_id = row["tax_category_id"]
 @prod.shipping_category_id = row["shipping_category_id"]
 @prod.promotionable = row["promotionable"]
 @prod.meta_title = row["meta_title"]
 @prod.featured = row["featured"]
 @prod.supplier_id = row["supplier_id"]
 @prod.master.price = row["master_price"]
 @prod.master.sku = row["sku"]

 [@prod, @prod.master, @prod.master.price].each do |obj|
   render json: obj if obj.errors.present?
 end
 @prod.save!

这里是 spree-core 来源:Spree Product Model