Bignums, integers and migrations

Hi. I'm using a migration to extract data from one table, to another. In the process I also convert ip-adresses to integers, for insertion in the new table.

Problem is that migrations doesn't seem to handle large numbers very well. The conversion works fine from the script/console, but when running it from migrations only very low IP-ranges "make it thru". Integer-based IPs seem to be capped around 2150000000.

def self.up     require 'ipaddr'     @ips = GeoIpDatabase.find(:all)     @ips.each do |ip|       start_ip = IPAddr.new(ip.start_ip)       end_ip = IPAddr.new(ip.end_ip)       new_ip = Ip.new( :start_ip => start_ip.to_s, :end_ip => end_ip.to_s, :start_ip_integer => start_ip.to_i, :end_ip_integer => end_ip.to_i )       new_ip.save     end   end

I'm using MySQL, with the integer-columns migrated as, yes, integers :wink: Anyone know of a workaround?

Thanks!

You are probably running into the limitation of the integer type of the database. Try storing them as strings instead of integers and use the model to generate integers from them when you need them. That is, have db attributes :start_ip_intstring and :end_ip_intstring (say) and virtual attributes :start_ip_integer and :end_ip_integer which do the conversion.

Problem is that I'm performing math stuff on them to see if an IP-adress is in the range in between:

Ip.find(:all, :conditions => ["start_ip_integer <= ? AND end_ip_integer

= ?", @request_ip, @request_ip])

So converting them one by one would be painfully slow i suppose? Specially since I have about 1 million ranges :wink:

The problem seems to be corrected when I change the int column to bigint in the MySQL table. However, I don't know if I can set it to bigint in the migrations directly. Can I?

Problem solved, simply by changin :integer to :bigint in the migrations. Thanks!