将 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
我正在我的应用程序中使用 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