处理重复的数据库条目

时间:2012-12-09 08:19:26

标签: ruby-on-rails ruby postgresql activerecord

我正在尝试处理多个数据库条目。我们一直在废弃网站上的数据,而有人忘了对已经创建的当前数据进行检查。我们现在有大约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然后排序那些可能导致问题的数字。我正在寻找一些新问题。

2 个答案:

答案 0 :(得分:5)

12,000并不适合记忆。这个解决方案怎么样:

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

答案 1 :(得分:0)

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