module JamRuby class MaxMindGeo < ActiveRecord::Base self.table_name = 'max_mind_geo' def self.import_from_max_mind(file) # File Geo-139 # Format: # startIpNum,endIpNum,country,region,city,postalCode,latitude,longitude,dmaCode,areaCode MaxMindGeo.transaction do MaxMindGeo.delete_all File.open(file, 'r:ISO-8859-1') do |io| MaxMindGeo.pg_copy_from io, :map => { 'startIpNum' => 'ip_start', 'endIpNum' => 'ip_end', 'country' => 'country', 'region' => 'region', 'city' => 'city', 'latitude' => 'lat', 'longitude' => 'lng'}, :columns => [:startIpNum, :endIpNum, :country, :region, :city, :latitude, :longitude] end end byebug User.find_each { |usr| usr.update_lat_lng } end # Make an IP address fit in a signed int. Just divide it by 2, as the least significant part # just can't possibly matter. We can verify this if needed. My guess is the entire bottom octet is # actually irrelevant def self.ip_address_to_int(ip) ip.split('.').inject(0) {|total,value| (total << 8 ) + value.to_i} / 2 end end end