2012-12-09 105 views
0

我试图处理多个数据库条目。我们一直在从一个网站上删除数据,有人忘记了写一个对照已经创建的当前数据的支票。我们现在有大约12,000个参赛作品。处理重复的数据库条目

我正在查看每个条目并删除那些重复的条目。这是我到目前为止有:

for Listing.each(:order => "street_address DESC") do |listing| 
    if listing.scraped == true 
    if previous_street_address && listing.street_address == previous_street_address 
     listing.delete 
    end 
    end 
    previous_street_address = listing.street_address 
end 

这是数据库模式:

create_table "listings", :force => true do |t| 
    t.integer "category" 
    t.string "street_address" 
    t.string "city" 
    t.string "state" 
    t.datetime "availability" 
    t.integer "bedrooms" 
    t.integer "bathrooms" 
    t.integer "square_footage" 
    t.string "short_description" 
    t.text  "long_description" 
    t.integer "price" 
    t.integer "period" 
    t.datetime "created_at",        :null => false 
    t.datetime "updated_at",        :null => false 
    t.integer "landlord_id" 
    t.float "latitude" 
    t.float "longitude" 
    t.datetime "expires_at" 
    t.boolean "warned_of_expiration" 
    t.integer "views",    :default => 0,  :null => false 
    t.boolean "fake" 
    t.string "short_web_url" 
    t.string "apartment_no" 
    t.string "zipcode" 
    t.datetime "delisted_at" 
    t.integer "daily_rate" 
    t.integer "photos_count" 
    t.string "delisted_reason" 
    t.boolean "scraped" 
    t.boolean "cats",     :default => false 
    t.boolean "dogs",     :default => false 
    end 

我知道我需要以一种有意义的方式对数据进行排序,但我不认为街道地址工作原理如果地址是“123 Anywhere Street”,并且我将Listing.street_address.to_i转换为123,然后按可能导致问题的那些数字进行排序。我正在寻找一些关于这个问题的新眼睛。

回答

5

12,000对于适应内存来说并不那么重要。这个解决方案如何:

all = Listing.all 
to_remove = all-all.uniq{|el| [el.street_address, ..., ...] } 
to_remove.each(&:delete) 
+1

不使用删除,使用破坏 – apneadiving

+0

@apneadiving我的答案的第一版使用'destroy'(你可以检查它)。但后来我意识到作者使用了'delete'。看起来他更了解如何处理他自己的数据。 – jdoe

+1

好,但我觉得我们必须时刻提醒人们。+ 1 – apneadiving

0

您可能会发现直接在Postgres中执行此操作更容易。 This thread有几个例子。