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」であるかのようにStreet Addressが機能するとは思いません.Listing.street_address.to_iは、それを123に変換してから、それらの番号で並べ替えますこれは問題を引き起こす可能性があります。私はこの問題について新鮮な目を探しています。

4

2 に答える 2

5

12,000 は、メモリに収まるほど多くはありません。この解決策はどうですか:

all = Listing.all
to_remove = all-all.uniq{|el| [el.street_address, ..., ...] }
to_remove.each(&:delete)
于 2012-12-09T08:41:14.267 に答える
0

これはPostgresで直接行う方が簡単な場合があります。このスレッドにはいくつかの例があります。

于 2012-12-09T20:04:50.003 に答える