2015-02-09 50 views
0

我正在編寫一個導入excel格式數據表的庫存系統。有3列,它是item_name,顏色,價格如何查找和合並RAILS中的所有ActiveRecord副本4

很多時候,item_name會是一樣的,但是顏色會有所不同。我想合併記錄的所有顏色屬性與相同的item_name

例如。

item_name => "groovy pants", colour => "BLK", price => "$199" 
item_name => "groovy pants", colour => "GRY", price => "$199" 
item_name => "groovy pants", colour => "RED", price => "$199" 

我想記錄合併成一個單一的一個

item_name => "groovy pants", colour => "BLK,GRY,RED", price => "$199" 

,並刪除所有已合併的那些的。

謝謝!

*********編輯********** 這裏是我從Rodrigo提供的解決方案中獲取的塊。

StoreMarkdown.all.each do |markdown| 
    duplicated = StoreMarkdown.find_by item_name: markdown.item_name 
    puts duplicated 

    if duplicated.size > 0 
    product.colour = product.colour + ",#{duplicated.map(&:colour).join(',')}" 
    product.save! 
    duplicated.destroy_all 
    end 

以下是重複

StoreMarkdown Load (0.2ms) SELECT "store_markdowns".* FROM "store_markdowns" 
    StoreMarkdown Load (0.1ms) SELECT "store_markdowns".* FROM "store_markdowns" WHERE "store_markdowns"."item_name" = 'Heust Hoodie' LIMIT 1 
#<StoreMarkdown:0x007fa2cf93d7c0> 
    CACHE (0.0ms) SELECT "store_markdowns".* FROM "store_markdowns" WHERE "store_markdowns"."item_name" = 'Heust Hoodie' LIMIT 1 
#<StoreMarkdown:0x007fa2cc211260> 
    CACHE (0.1ms) SELECT "store_markdowns".* FROM "store_markdowns" WHERE "store_markdowns"."item_name" = 'Heust Hoodie' LIMIT 1 
#<StoreMarkdown:0x007fa2cda0dc38> 
    CACHE (0.1ms) SELECT "store_markdowns".* FROM "store_markdowns" WHERE "store_markdowns"."item_name" = 'Heust Hoodie' LIMIT 1 
#<StoreMarkdown:0x007fa2cda17be8> 
    StoreMarkdown Load (0.3ms) SELECT "store_markdowns".* FROM "store_markdowns" WHERE "store_markdowns"."item_name" = 'Shine Jacket' LIMIT 1 
#<StoreMarkdown:0x007fa2cbfac8f8> 
    CACHE (0.1ms) SELECT "store_markdowns".* FROM "store_markdowns" WHERE "store_markdowns"."item_name" = ' Shine Jacket' LIMIT 1 
#<StoreMarkdown:0x007fa2cda544d0> 
    StoreMarkdown Load (0.3ms) SELECT "store_markdowns".* FROM "store_markdowns" WHERE "store_markdowns"."item_name" = 'Stres Pant' LIMIT 1 
#<StoreMarkdown:0x007fa2cbfc7e78> 
    CACHE (0.0ms) SELECT "store_markdowns".* FROM "store_markdowns" WHERE "store_markdowns"."item_name" = 'Stres Pant' LIMIT 1 
#<StoreMarkdown:0x007fa2cc249b60> 
    CACHE (0.0ms) SELECT "store_markdowns".* FROM "store_markdowns" WHERE "store_markdowns"."item_name" = 'Stres Pant' LIMIT 1 
#<StoreMarkdown:0x007fa2cc273e88> 
    StoreMarkdown Load (0.6ms) SELECT "store_markdowns".* FROM "store_markdowns" WHERE "store_markdowns"."item_name" = 'Together Pant' LIMIT 1 
#<StoreMarkdown:0x007fa2cf96b3f0> 
    CACHE (0.1ms) SELECT "store_markdowns".* FROM "store_markdowns" WHERE "store_markdowns"."item_name" = 'Together Pant' LIMIT 1 
#<StoreMarkdown:0x007fa2d080a0f0> 

輸出好像duplicated會在由線項目行,和duplicated.size正在返回未定義的方法中,由於是duplicated在一個有效記錄的對象阻止

回答

0

此代碼將做的工作:

blacklist_ids = [] 
StoreMarkdown.all.each do |md| 
    unless blacklist_ids.include?(md.id) 
    blacklist_ids << md.id 
    StoreMarkdown.where(item_name: md.item_name, 
         price: md.price). 
        where.not(id: md.id).each do |omd| 
     blacklist_ids << omd.id 
     new_colours = [] 
     new_colours << md.colour.split(',') 
     new_colours << omd.colour.split(',') 
     md.colour = new_colours.uniq.sort.join(',') 
     md.save 
     omd.destroy 
    end 
    end 
end 
+0

沒有相關的一切,我會在我解釋不清楚。只有1個Model,名爲StoreMarkdown,而item_name,color和price是每個Markdown項目的所有屬性。 – 2015-02-09 18:44:51

0

假設你將使用Product模型也一樣,我將進口的所有產品從Excel文件後刪除重複:

Product.all.each do |product| 
    duplicated = Product.where(name: product.name) 

    if duplicated.size > 0 
    product.colors = product.colors + ",#{duplicated.map(&:colors).join(',')}" 
    product.save! 
    duplicated.destroy_all 
    end 
end 
+0

嗯,這似乎不工作。 duplicated.size返回undefined。在檢查時,重複設置爲單個活動記錄對象。我已經把我的版本放在上面。我對Rails仍然很陌​​生,但看起來,這個模塊逐行提取所有產品。 – 2015-02-09 18:36:03

相關問題