2012-02-09 6 views
3

私は10,000の場所の.csvファイルをインポートしました。データベースをループし、通常の "geocode_by:住所 "Rails GeoCoderは既存のデータベースとgeocode_by:address、:city、stateをループします。

ジオコーダーの宝石を使用しています。

私のデータベーススキーマは、私は、コントローラのアクションではなく、検証の上、これを行うことができ、この

create_table "locations", :force => true do |t| 
     t.string "Address" 
     t.string "City" 
     t.string "State" 
     t.string "Zip" 
     t.float "latitude" 
     t.float "longitude" 
     t.datetime "created_at" 
     t.datetime "updated_at" 
    end 

のように見えますか? 私はこのような何かを行う必要があります。

def index 
    @locations = Location.all 
    @locations.each do |l| 
     new_address = "#{l.Address} #{l.City} #{l.State}" 
     geocode_by = :new_address 
    end 
end 

をしかし、いや、任意の助けを大幅に高く評価されて、ありがとうございました!

答えて

3

私は物事がこのコントローラコードで作業得ることができた:

def index 
    if params[:search].present? 
     @locations = Location.near(params[:search], 20, :order => :distance) 
    else 
     @locations = Location.all 
     @locations.each do |l| 
     if l.latitude.nil? 
      new_location = "#{l.HP_Address_1} #{l.HP_City} #{l.HP_State}" 
      s = Geocoder.search(new_location) 
      l.latitude = s[0].latitude 
      l.longitude = s[0].longitude 
      l.save 
     end 
     end 
    end 
    end 

これは、データベース内のすべてのエントリをループし、緯度と経度の値がエンコードされていない場合には、正しいジオコーダー関数を呼び出し、返された緯度/経度値をデータベースに格納します。

私のデータベースには9k個のエントリがあります。そのため、GoogleマップのAPIの制限により、1日あたり2kバイトしかエンコードできません。しかし、モデルでgeocoded_byを使用して作成中にエントリをエンコードする人々にとって、これはコントローラで動作します。

1

これは、完了するまでに時間がかかる可能性があるため、従業員(仕事が遅れたり再調整されたりする)と同じようなものです。しかし、私はその質問を理解しているかどうか分からないので、これはあなたが期待している答えの種類ではないかもしれません。

+0

はどのようにインスタンスのResqueを使用していることを実装するに行きますか? – Matt

1

クラス内のすべてのレコードを実行する場合は、このためのレーキタスクがあります。

すくいジオコード:すべてのCLASS = YourModel睡眠= 0.25

関連する問題